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

2023-12-08

我快要疯了,我希望这是我忽略的事情。

我正在经历间歇性的FileLoadExceptions,即使代码在部署之间发生变化,它们也会在部署后显示不更改任何程序集引用.

看看最近的例子,我看到了FileLoadException due to System.IO.Compression, 版本4.2.0.0没有被发现。

在所有情况下,我们都引用System.IO.Compressionnuget包,版本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 包文件夹中的版本。

ProjectB:

Reference to the correct System.IO.Compression assembly

上面正确地指向了程序集的 nuget packages 版本,这实际上是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从某个位置is not被我们的任何项目(直接)引用?而且,我能做些什么来解决这个问题?

此外,虽然我在本地使用 Visual Studio 2019 的(当前)RC 版本,但我们的构建代理(Azure DevOps Pipelines)正在使用 Visual Studio 2017。

在运行时,我们发现记录了上述异常,并且创建 ZIP 文件的处理失败。

Update

除了上述内容之外,我还做了一些额外的挖掘,发现了一个指向4.2.0.0该程序集的版本。我已经手动将其降低到4.1.2.0,并再次部署到我们的测试环境,并进行一些额外的运行状况检查,看看进展如何。

仍然需要了解我们是如何进入这种状态的,以及为什么与实际情况存在差异。csproj所指向的内容与在解决方案资源管理器中看到的内容。


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

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

那是因为:

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

要解决此问题,我们可以向这些引用添加绑定重定向,以使用标准引用System.IO.Compression并且不带任何 Nuget 包System.IO.Compression。如果您仍想使用参考System.IO.Compression从 nuget 包中,您可以删除System.IO.Compression来自 MSBuild 工具。

从 Github 查看更多详细信息:

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

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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