c# - 具有相同 nuget 包的项目引用不同版本的程序集
问题描述
我在这里发疯了,我希望这是我忽略的东西。
我遇到间歇性FileLoadExceptions
问题,即使部署之间的代码更改不会更改任何程序集引用,部署后也会出现这种情况。
看看最近的例子,我看到一个FileLoadException
由于System.IO.Compression
,版本4.2.0.0
没有找到。
在所有情况下,我们都引用System.IO.Compression
nuget 包 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
:
以上引用的是 中的文件,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
:
上面正确地指向了程序集的 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
解决方案资源管理器中所指的内容存在差异。
解决方案
具有相同 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.Compression
nuget 包中的引用,可以System.IO.Compression
从 MSBuild 工具中删除。
从 Github 查看更多详细信息:
https://github.com/dotnet/corefx/issues/25773
希望这可以帮助。
推荐阅读
- django - 在哪里添加“social_core.backends.yammer.YammerOAuth2”以在 django 中进行社交身份验证
- html - 执行一次 ng-repeat
- arrays - 为什么在 Go 中调用可变参数函数时不能_直接_使用数组?
- javascript - 从 iframe 内部关闭的 Bootstrap 3.3.1 模态弹出窗口
- typescript - Redux 如何生成它们的类型?
- angular - 如果 next.handle 返回 401(未授权),则 httpinterceptor 中的异步更新令牌
- php - 单页上的两个表单,一个在 laravel 中不起作用
- go - 在测试中调用“stty size”会产生“Inappropriate ioctl for device”错误,如何解决?
- google-api - 是否有用于在 G Suite 中创建或管理自定义目录的 API?
- javascript - Javascript Fetch 偶尔返回 404