具有相同nuget包的项目反映了不同版本的程序集

时间:2019-03-07 06:42:13

标签: c# visual-studio nuget assembly-binding-redirect

我在这里生气,我希望这是我完全忽略的事情。

我遇到间歇性的FileLoadExceptions,即使部署之间的代码更改不更改任何程序集引用,部署之后也会显示间歇性的FileLoadException

以最新的示例为例,我发现由于System.IO.Compression的{​​{1}}版本4.2.0.0的存在而导致的System.IO.Compression

在所有情况下,我们都引用4.3.0版的ProjectA nuget软件包。

在我们解决方案中的两个项目中,我发现了一些非常奇怪的东西。
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

太好了,在两种情况下,我们都指向磁盘上的同一程序集。

但是,当我在解决方案资源管理器中查看引用的文件时,会看到以下内容:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.IO.Compression.dll

Reference to some other System.IO.Compression assembly

上面引用的是4.2.0.0中的文件,更重要的是具有ProjectB的版本,而不是nuget包文件夹中的版本。

4.1.2.0

Reference to the correct System.IO.Compression assembly

以上内容正确指向了程序集的nuget软件包版本,实际上是ProjectA

要重申,引用ProjectB的{​​{1}}都具有绑定重定向,该重定向将执行以下操作:

<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的版本?而且,我该怎么做才能解决此问题?

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

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

更新

此外,我还做了一些其他的挖掘工作,发现绑定重定向指向该程序集的4.2.0.0版本。我将其手动降低到4.1.2.0,然后通过一些额外的运行状况检查将其再次部署到我们的测试环境,以了解我们的工作情况。

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

1 个答案:

答案 0 :(得分:1)

  

具有相同nuget包的项目反映了不同版本的程序集

这是我们构建.NET Framework 4.6.x应用程序时的known issue

那是因为:

  

这是由于注入了对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

希望这会有所帮助。