首页 > 解决方案 > 具有相同 nuget 包的项目引用不同版本的程序集

问题描述

我在这里发疯了,我希望这是我忽略的东西。

我遇到间歇性FileLoadExceptions问题,即使部署之间的代码更改不会更改任何程序集引用,部署后也会出现这种情况。

看看最近的例子,我看到一个FileLoadException由于System.IO.Compression,版本4.2.0.0没有找到。

在所有情况下,我们都引用System.IO.Compressionnuget 包 version 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

引用其他一些 System.IO.Compression 程序集

以上引用的是 中的文件,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 包文件夹中的版本。

ProjectB

引用正确的 System.IO.Compression 程序集

上面正确地指向了程序集的 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解决方案资源管理器中所指的内容存在差异。

标签: c#visual-studionugetassembly-binding-redirect

解决方案


具有相同 nuget 包的项目引用不同版本的程序集

这是我们构建 .NET Framework 4.6.x 应用程序时的一个已知问题。

那是因为:

这是由于对 NETStandard 2.0 的注入支持。我们将新程序集注入 NET 4.6.1 及更高版本的桌面项目,以增加对 netstandard2.0 的支持。我们现在在目标而不是包中执行此操作,因为它不再需要引用包来构建网络标准库。每当我们看到引用了 netstandard1.5 或更高版本的库时,就会发生这种注入(参见 dotnet/sdk#1386)。

为了解决这个问题,我们可以将绑定重定向添加到那些引用以使用标准引用System.IO.Compression而不为System.IO.Compression. 如果您仍想使用System.IO.Compressionnuget 包中的引用,可以System.IO.Compression从 MSBuild 工具中删除。

从 Github 查看更多详细信息:

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

希望这可以帮助。


推荐阅读