.NET MAUI项目Obfuscar混淆报错:无法找到Mono.Android程序集
问题原因分析
1. 目标程序集路径错误
.NET MAUI的Android构建输出结构和普通.NET项目不同,Release模式下,编译后的MyProj.dll并非直接存放在obj\Release\net8.0-android根目录,而是位于对应CPU架构的子目录中(比如android-arm64、android-x86_64等),导致Obfuscar找不到指定的dll文件。
2. Mono.Android程序集搜索路径缺失
Mono.Android.dll属于.NET MAUI的Android平台依赖,它并不在你的项目输出目录(obj/bin)中,而是存储在.NET Android SDK或NuGet包缓存目录里。Obfuscar默认只会扫描InPath指定的目录,因此无法自动找到该依赖程序集。
解决方案
步骤1:修正目标程序集的路径
- 打开你的MAUI项目的
bin\Release\net8.0-android目录,找到对应目标架构的子文件夹(比如你要打包的是arm64,就进入android-arm64)。 - 确认该子文件夹下存在
MyProj.dll,然后修改Obfuscar配置中的InPath为这个实际路径:<Var name="InPath" value="C:\Path\To\My\Project\bin\Release\net8.0-android\android-arm64" />
步骤2:添加Mono.Android的搜索路径
在Obfuscar配置文件中添加<SearchPath>节点,指向Mono.Android.dll所在的目录,以下是两个常见的路径(根据你的.NET MAUI版本调整版本号):
- .NET Android SDK路径(以.NET 8为例):
<SearchPath path="C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\34.0.43\lib\net8.0" /> - NuGet缓存路径(版本号需匹配你的项目依赖):
<SearchPath path="%USERPROFILE%\.nuget\packages\mono.android\12.0.0.0\lib\net6.0-android" />
步骤3:验证配置并重新执行混淆
修改完成后的完整配置示例:
<Obfuscator> <Var name="InPath" value="C:\Path\To\My\Project\bin\Release\net8.0-android\android-arm64" /> <Var name="OutPath" value="C:\Path\Obfuscated" /> <Module file="$(InPath)\MyProj.dll" /> <!-- 添加平台依赖的搜索路径 --> <SearchPath path="C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\34.0.43\lib\net8.0" /> <SearchPath path="%USERPROFILE%\.nuget\packages\mono.android\12.0.0.0\lib\net6.0-android" /> <Settings> <EncryptStrings value="true" /> <RemoveUnused value="true" /> <Optimize value="true" /> </Settings> <Rename> <RenamePublic value="true" /> <Skip type="System.Object" /> <Skip type="System.String" /> <Skip type="System.Console" /> </Rename> <Output path="$(OutPath)" /> <Map file="$(OutPath)\Map.xml" /> </Obfuscator>
保存配置后,重新执行Obfuscar.Console.exe obfuscar.xml即可。
额外注意事项
- 如果你的项目启用了代码裁剪(Publish时默认开启),建议先构建未裁剪的Release版本再执行混淆,否则可能导致混淆后的程序集缺少必要的依赖。
- 确认所有
<SearchPath>中的路径都存在,版本号与你的项目所使用的.NET MAUI版本一致。
内容的提问来源于stack exchange,提问作者Nazarii Balyshyn
相关产品推荐
相关产品推荐

