同一个NuGet包的项目引用了不同版本的程序集

4
我在这里快疯了,希望这只是我忽略了的事情。
我经历了间歇性的FileLoadExceptions,在部署后即使代码更改没有改变任何程序集引用也会出现。
最近遇到一个例子,由于无法找到System.IO.Compression版本4.2.0.0,我看到了一个FileLoadException。
在所有情况下,我们都引用System.IO.Compression nuget包,版本4.3.0。
查看我们解决方案中的两个项目,我注意到一些非常奇怪的事情。 ProjectA引用ProjectB。
ProjectA在它的packages.config文件中有如下的引用:
<package id="System.IO.Compression" version="4.3.0" targetFramework="net462" />

ProjectB 在其 package.config 文件中有以下引用:

<package id="System.IO.Compression" version="4.3.0" targetFramework="net462" />

当我查看*.csproj文件时,我看到了这个: ProjectA:
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
  <HintPath>..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
</Reference>`

ProjectB:


<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
  <HintPath>..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
</Reference>`

很好,我们在这两种情况下都指向了同一个程序集。

然而,当我在解决方案资源管理器中查看引用的文件时,我看到了这个:

ProjectA:

Reference to some other System.IO.Compression assembly

上面引用了一个文件,位于C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.IO.Compression.dll,更重要的是它的版本是4.2.0.0,而不是NuGet包文件夹中的版本。 :

Reference to the correct System.IO.Compression assembly

上述正确指向程序集的NuGet包版本,实际上是4.1.2.0
再次强调,ProjectA引用了ProjectB,两者都有一个绑定重定向,执行以下操作:
<dependentAssembly>
    <assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>`

所以我的问题是,为什么Visual Studio从一个未被任何项目(直接)引用的位置拉取System.IO.Compression的版本?我应该怎么做才能解决这个问题?
另外,在本地我使用的是当前版本的RC Visual Studio 2019,而我们的构建代理(Azure DevOps Pipelines)正在使用Visual Studio 2017。
在运行时,我们发现上述的异常被记录下来,并且我们创建ZIP文件的处理失败了。
更新
除上述内容外,我还进行了一些额外的研究,发现有一个绑定重定向指向这个程序集的4.2.0.0版本。我手动将它降级到4.1.2.0,并再次部署到我们的测试环境中并进行一些额外的健康检查,以查看进展如何。
仍需要理解我们如何进入这种状态,以及csproj所指向的内容与Solution Explorer中所看到的内容之间的差异。
1个回答

3
相同NuGet包引用不同版本的程序集的项目
这是在构建.NET Framework 4.6.x应用程序时的一个已知问题
这是因为:
“这是由于注入了对NETStandard 2.0的支持。我们将新的程序集注入到NET 4.6.1及更高版本的桌面项目中,以添加对netstandard2.0的支持。我们现在使用目标来执行此操作,而不是使用包,因为不再需要引用包来构建netstandard库。每当我们看到引用了netstandard1.5或更高版本的库时,就会发生这种注入(请参见dotnet/sdk#1386)。”
要解决此问题,我们可以添加绑定重定向到那些引用,以使用标准引用来引用System.IO.Compression,并且不引入任何System.IO.Compression的Nuget包。如果您仍然想从Nuget包中使用引用System.IO.Compression,则可以从MSBuild工具中删除System.IO.Compression。
在Github上查看更多详细信息:

https://github.com/dotnet/corefx/issues/25773

希望这有所帮助。

好的 - 感谢提供详细信息。我认为如果我们将所有内容升级到.NET 4.7,这个问题可能会消失?我正在核实Azure应用服务和云服务是否支持该版本的.NET。 - Brendan Green
@BrendanGreen,据我所知,这个问题仍然存在于.NET 4.7.1上。而.NET 4.7.2可以解决其中的一些问题,但并非全部,请参考此处的信息:https://github.com/dotnet/standard/issues/481#issuecomment-429653699。另外,托管的VS2017支持.net 4.7.1:https://github.com/Microsoft/azure-pipelines-image-generation/blob/master/images/win/Vs2017-Server2016-Readme.md#visual-studio-2017-enterprise - Leo Liu
1
为了澄清,当我回顾过去时,我们开始将解决方案的一些部分转换为.NET Standard 2.0的过程是有意义的,我开始认为这就是问题开始出现的时候。感谢提供额外的参考资料 - 我现在有一些东西可以研究了... - Brendan Green
@BrendanGreen,欢迎随时提出问题:)。如果您需要进一步的帮助,请告诉我。 - Leo Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接