【发布时间】:2018-01-02 11:34:14
【问题描述】:
在一个包含 52 个项目(全部为 net462)的大型解决方案中,我们的一些依赖项的最新版本现在仅针对 NET 标准构建。因此,它们依赖于 NuGet 包 NETStandard.Library,而后者又引入了许多其他 4.3.x 版本的 System.* 包,这些包通常位于 .NET Framework 本身中。
因此,一些项目从 packages 文件夹引用 System.* 库,而其他项目从 .NET Framework 引用 System.* 库。
这会导致众所周知的运行时问题 f.e.:
消息:System.IO.FileLoadException:无法加载文件或程序集“System.Net.Http,版本=4.1.1.2,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)
深入了解NETStandard.Library包的依赖关系,我们可以看到这些包中也存在同样的问题:
- System.Collections.*
- System.ComponentModel.*
- System.Console
- System.Globalization.*
- System.IO.*
- System.Linq.*
- System.Net.*
- System.ObjectModel
- System.Reflection.*
- System.Resources.ResourceManager
- System.Runtime.*
- System.Text.*
- System.Threading.*
- System.Xml.*
通常这可以通过在其他项目中安装相同的包来解决,但是我们在这里处理很多项目和很多包,我不想盲目地将所有这些依赖项添加到所有 52 个项目中.
这让我想知道是否有人知道一种简单的方法可以从这种情况中恢复并让所有项目从 NuGet 包文件夹中引用正确的包/DLL(如果他们当前使用 NET Framework 内部包)。
net462 和 net471 的简单 VS 解决方案演示了该问题,可以找到 here
【问题讨论】:
-
对于 4.7.1 及以上版本以外的 .NET Framework,您根本没有选择,只能做您现在正在做的事情。 4.7.1 及更高版本默认提供 shim 组件,您不再需要这样做。更多内容blogs.msdn.microsoft.com/dotnet/2017/10/17/…
-
4.7.1 仍然需要其中一些程序集,因为 4.7.1 中存在错误 - 它附带了错误的程序集版本。
-
@WouterHuysentruit,目前看来,切换到最新的框架 4.7.1 是一个可行的选择。您可以在获得更好的解决方案之前将您的评论转换为回答并接受它,这样可以帮助遇到相同问题的其他社区成员。
-
啊,搞砸了。将 Moq 更新到 4.8.0 取决于
System.Threading.Tasks.Extensions 4.4.0,现在很多单元测试都为System.Net.Http抛出 FileLoadException。我要烧掉这个地方了:p -
有几次类似的情况,通常匹配的 .net 版本不正确和/或构建顺序可能不是这种情况,但无论如何都值得检查。
标签: c# nuget visual-studio-2017