我在这里生气,我希望这是我完全忽略的事情。
我遇到间歇性的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
:
上面引用的是4.2.0.0
中的文件,更重要的是具有ProjectB
的版本,而不是nuget包文件夹中的版本。
4.1.2.0
:
以上内容正确指向了程序集的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
所指向的内容与解决方案资源管理器中看到的内容之间存在差异。
答案 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
希望这会有所帮助。