在一个包含52个项目(所有net462)的大型解决方案中,我们的一些依赖项的最新版本现在仅针对.NET标准构建。因此,它们依赖于NuGet包NETStandard.Library
,后者又会拖拽很多其他4.3.x版本的System.*
包,这些包通常在.NET Framework中。
因此,一些项目引用packages文件夹中的System.*
库,而其他项目引用.NET Framework中的System.*
库。
这导致众所周知的运行时问题,即:
消息:System.IO.FileLoadException:无法加载文件或程序集&System; Net.Net.Http,Version = 4.1.1.2,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其中一个依赖项。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT异常:0x80131040)
深入研究NETStandard.Library
软件包的依赖关系,我们可以看到这些软件包中也存在同样的问题:
通常可以通过在其他项目中安装相同的软件包来解决这个问题,但是我们在这里处理了很多项目和很多软件包,我不想盲目地添加所有这些依赖项所有52个项目。
这让我想知道是否有人知道从这种情况中恢复的简单方法,并使所有项目从NuGet包文件夹中引用正确的包/ DLL,如果它们当前使用.NET Framework内部文件夹。
可以找到针对net462和net471的简单VS解决方案来证明问题here
答案 0 :(得分:11)
在默认项目模板中,System.Net.Http
作为参考添加到项目中,而不是作为nuget包。
在两个解决方案(4.6.1和4.7.1)中:
项目ClassLibrary
依赖于System.Net.Http
作为nuget包。
项目ConsoleApp1
依赖System.Net.Http
作为.NET Framework的简单参考
因此,该问题与Target Framework版本无关。
要解决此问题,请将相同版本的
System.Net.Http
作为nuget包添加到所有项目(使用它)。
在解决方案资源管理器中右键单击解决方案,然后选择Manage NuGet Packages for Solution...
切换到Installed
标签
在列表中找到System.Net.Http
,然后选择它。
检查当前状态:
将相同的版本的软件包(在您的情况下为4.3.0)安装到ConsoleApp1
项目。
检查结果:
完成。
此外,最好在您的解决方案中整合软件包版本。相反,您可能会在构建期间出现版本冲突。或者,更糟糕的是,运行时错误如MethodNotFound
,因为绑定重定向到另一个版本的依赖项。
此处描述了System.Net.Http
问题的原因:
{{3>}部分如何防止此类情况发生? 2.1
结果我们确定了2个有问题的OOB包,它们不是平台本身的叶子节点,并且依赖于它们的平台--System.Net.Http和System.IO.Compression。
这意味着相同的System.Net.Http
库在.NET Framework中提供,并作为OOB(带外)nuget包。一些nuget包可以引用它的nuget版本。这就是我在一开始就描述的问题。
因此,您不必修复对所有System.*
库的引用。仅适用于这两项:System.Net.Http
和System.IO.Compression
。