VS 2019 C#项目如何使用同一NuGet包的两个不同版本
操作错误说明
你之前的尝试符合官方给出的基础调整思路,不属于操作错误。问题本质是NuGet默认的依赖统一规则会自动筛选同包的最高适配版本,不允许同个项目通过NuGet同时引用同一包的多个版本,因此直接添加两个版本的PackageReference不会生效。
问题根因
NuGet在解析依赖时默认遵循「最高适用版本」规则,你的包A要求System.Runtime.CompilerServices.Unsafe版本≥5.0.0,因此默认会拉取5.0.0及以上版本,你主动安装4.5.3版本就会触发NU1605降级警告/报错。同时.NET运行时默认不允许在同一上下文中加载同一程序集的两个不同版本,强行共存需要额外配置。
可行解决方案
方案1(最推荐):调整依赖包版本
查找适配统一版本Unsafe的包A/包B版本:
- 找包A的历史版本,其依赖的Unsafe版本≤4.5.3
- 或找包B的更新版本,其依赖的Unsafe版本≥5.0.0
该方案无后续兼容风险,是最优解。
方案2:强制指定单版本,屏蔽降级警告
如果实测包A可以在4.5.3版本的Unsafe下正常运行,可直接在项目的.csproj文件中显式声明指定版本的包引用,同时屏蔽NU1605警告:
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.5.3"> <NoWarn>NU1605</NoWarn> </PackageReference>
注意:该方案存在运行时风险,如果包A调用了Unsafe 5.0.0新增的API,运行时会抛出MissingMethodException类错误。
方案3(极端场景使用):配置多版本程序集共存
如果必须同时使用两个版本的Unsafe,可通过手动引用+extern alias实现:
- 卸载项目中所有通过NuGet安装的System.Runtime.CompilerServices.Unsafe包
- 分别下载4.5.3、5.0.0版本的Unsafe.dll,放在项目下不同的本地目录
- 手动添加两个dll的项目引用,分别右键引用→属性,为两个dll设置不同的别名,比如
Unsafe453和Unsafe500 - 在需要调用对应版本Unsafe的代码文件头部添加别名声明,使用时指定别名:
// 代码头部声明别名 extern alias Unsafe453; extern alias Unsafe500; // 调用时指定前缀 var res1 = Unsafe453::System.Runtime.CompilerServices.Unsafe.As<object, string>(ref objA); var res2 = Unsafe500::System.Runtime.CompilerServices.Unsafe.As<object, string>(ref objB);
注意:该方案维护成本极高,容易出现不可预知的运行时错误,非必要不建议使用。
内容的提问来源于stack exchange,提问作者Thomas Bonte
相关产品推荐
相关产品推荐

