Xamarin.Android构建报错:加载未引用的System.IdentityModel.Tokens.Jwt程序集
针对你在VS 2017中遇到的Xamarin.Android构建错误,我来逐一解答你的两个问题:
问题1:如何查明构建尝试加载该程序集的原因?
可以通过以下几个步骤追踪根源:
- 检查间接依赖:你项目没直接引用
System.IdentityModel.Tokens.Jwt,大概率是某个已安装的NuGet包或依赖项目间接引入了它。你可以:- 打开NuGet包管理器,查看每个已安装包的“依赖项”标签,找是否有包依赖这个程序集;
- 查看项目
obj文件夹下的project.assets.json文件,搜索System.IdentityModel.Tokens.Jwt,这个文件会列出所有直接和间接的依赖关系,能看到是哪个包把它带进来的; - 用命令行工具执行
dotnet list package --include-transitive(如果你的项目支持.NET CLI),会输出完整的依赖链。
- 查看详细构建日志:在VS中打开「工具 -> 选项 -> 项目和解决方案 -> 生成并运行」,把「MSBuild项目生成输出详细程度」设为「详细」,然后重新构建项目。在输出日志中搜索
System.IdentityModel.Tokens.Jwt,能看到具体是哪个MSBuild任务(比如编译、链接器处理、打包)触发了程序集加载,以及相关的上下文信息。 - 检查项目文件和自定义构建逻辑:手动打开你的
.csproj文件,搜索System.IdentityModel.Tokens.Jwt,看是否存在残留的<Reference>或<PackageReference>节点(哪怕是被注释掉的)。另外,如果项目使用了自定义MSBuild目标文件(比如导入的.targets),也要检查这些文件里是否有主动加载该程序集的逻辑。
问题2:构建为何要尝试加载程序集?这难道不是应用程序的职责吗?
构建阶段加载程序集和应用运行时加载是完全不同的场景,原因主要有这些:
- 编译与静态分析需求:MSBuild在编译代码时,需要解析所有依赖的程序集来获取类型、方法等元数据,确保代码能正确编译。比如如果某个间接依赖的类型被你的代码隐式用到(比如通过接口实现、反射调用),编译阶段必须找到对应的程序集才能完成类型检查。
- Xamarin.Android的特殊构建流程:Xamarin.Android的构建不仅包含编译,还包括链接器优化和APK打包步骤。链接器需要扫描所有依赖的程序集,分析哪些代码是必要的,哪些可以裁剪掉以减小APK体积;打包阶段则需要确认所有必要的程序集都被包含到APK中。这些步骤都需要静态加载程序集来完成分析,无法依赖应用运行时的
ResolveEventHandler动态加载——毕竟构建时还没有运行环境,而且构建工具需要提前确保最终产物的完整性和兼容性。 - Mono Profile兼容性检查:错误提示里提到的“Mono for Android profile”是Xamarin.Android对.NET程序集的兼容性约束,构建时会检查所有依赖程序集是否符合该profile的要求,避免运行时出现不兼容问题。这也是为什么即使你没直接引用,只要依赖链里有这个程序集,构建工具就会尝试加载它来做兼容性验证。
内容的提问来源于stack exchange,提问作者mipnw
相关产品推荐
相关产品推荐

