Xamarin Forms引用.NET Standard 2.0类库NuGet包加载失败问题
看起来你遇到的问题是Xamarin运行时无法找到NuGet包中的.NET Standard程序集——虽然包本身包含了该文件,且在.NET Core环境下能正常工作。这种情况通常和NuGet包的结构配置、Xamarin项目的目标框架兼容性或者缓存问题有关,下面是几个针对性的解决方案:
检查NuGet包的目录结构是否符合规范
Xamarin对NuGet包的目录结构有严格要求:.NET Standard程序集必须放在lib/netstandard2.0/目录下,平台特定的程序集要放在对应平台的子目录中(比如Android是lib/monoandroidXX/,iOS是lib/xamariniosXX/,XX为具体版本号)。解压你的nupkg文件,确认Matchmore.SDK.NetStandard.dll确实在lib/netstandard2.0/路径下,而非根目录或其他错误位置。验证nuspec打包配置的正确性
如果是手动编写nuspec文件打包,一定要确保<files>节点正确映射了所有程序集的源路径和目标路径。举个正确的配置例子:<files> <!-- .NET Standard 2.0 程序集 --> <file src="bin/Release/netstandard2.0/Matchmore.SDK.NetStandard.dll" target="lib/netstandard2.0/" /> <!-- Android平台程序集 --> <file src="bin/Release/MonoAndroid90/Matchmore.SDK.Android.dll" target="lib/monoandroid9.0/" /> <!-- iOS平台程序集 --> <file src="bin/Release/Xamarin.iOS10/Matchmore.SDK.iOS.dll" target="lib/xamarinios10/" /> </files>注意目标框架的标识要准确,比如
monoandroid9.0对应Android 9.0,xamarinios10对应iOS 10,要和你的项目目标框架版本匹配。清理缓存并重建项目
缓存问题经常会导致这种奇怪的引用错误,按以下步骤操作:- 删除Xamarin.Forms项目各个平台(Android、iOS、共享项目)的
bin和obj目录; - 清理NuGet缓存,在终端执行命令:
dotnet nuget locals all --clear; - 重新安装你的NuGet包,然后重建整个解决方案。
- 删除Xamarin.Forms项目各个平台(Android、iOS、共享项目)的
确认Xamarin项目的目标框架版本
.NET Standard 2.0需要Xamarin项目的目标框架达到一定版本才能支持:- Xamarin.Android需要目标框架为MonoAndroid 8.0及以上;
- Xamarin.iOS需要目标框架为Xamarin.iOS 10.0及以上。
打开项目属性,检查并更新目标框架版本到符合要求的范围。
排查程序集依赖项
虽然你的.NET Standard程序集在.NET Core中正常工作,但Xamarin的运行环境和.NET Core存在差异,可能依赖了一些Xamarin不支持的库。你可以用dotnet list package命令查看程序集的依赖,或者用ILSpy工具反编译程序集,确认所有依赖项都能在Xamarin环境中正常加载。直接引用程序集做测试
暂时跳过NuGet包,直接将三个平台的程序集分别引用到对应的项目中(.NET Standard程序集引用到共享项目,Android程序集引用到Android项目,iOS程序集引用到iOS项目),如果这样能正常运行,说明问题肯定出在NuGet包的打包配置上,回到前面的步骤重新检查nuspec和目录结构。
内容的提问来源于stack exchange,提问作者Łukasz Młynik

