发现了无法解决的“System.Runtime.CompilerServices.Unsafe”不同版本之间的冲突。

21

这可能看起来像许多类似的问题之一,但我在其他问题中找不到解决方案。

我将直接跳转到二进制日志:

enter image description here

以下是ResolveAssemblyReference任务的相应子树:

There was a conflict between "System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" and "System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
    "System.Runtime.CompilerServices.Unsafe, Version = 4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" was chosen because it was primary and "System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" was not.
    References which depend on "System.Runtime.CompilerServices.Unsafe, Version = 4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" [C:\Users\mkharitonov\.nuget\packages\system.runtime.compilerservices.unsafe\4.5.2\ref\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll].
    C:\Users\mkharitonov\.nuget\packages\system.runtime.compilerservices.unsafe\4.5.2\ref\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
          Project file item includes which caused reference "C:\Users\mkharitonov\.nuget\packages\system.runtime.compilerservices.unsafe\4.5.2\ref\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll".
            C:\Users\mkharitonov\.nuget\packages\system.runtime.compilerservices.unsafe\4.5.2\ref\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
        C:\Users\mkharitonov\.nuget\packages\microsoft.extensions.primitives\2.0.0\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll
          Project file item includes which caused reference "C:\Users\mkharitonov\.nuget\packages\microsoft.extensions.primitives\2.0.0\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll".
            C:\Users\mkharitonov\.nuget\packages\microsoft.extensions.primitives\2.0.0\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll
            C:\Users\mkharitonov\.nuget\packages\microsoft.extensions.caching.abstractions\2.0.0\lib\netstandard2.0\Microsoft.Extensions.Caching.Abstractions.dll
            xyz.Common
            C:\xyz\tip\bin.link\xyz.Web.Framework.dll
            C:\xyz\tip\bin.link\xyz.Web.Platform.dll
            AccrualEngine
            DataProcessor
            xyz.BusinessAPI.Core
            xyz.DataManager
            DataSvc
            xyz.Data
            xyz.HtmlPlatform
            xyz.BusinessAPI
            DeviceServices
            GrossPayEngineDataProvider
            MultiApprovalProcessor
            Payroll.Core.Data
            PunchStatusReconciliationEngine
            RateEngine2
            RateEngineDataProviderServer
            RuleEngine
            RuleEngineDataProvider
            RuleEngineHelper
            SharpTop.Common.Security.MemberSession
            SharpTop.DB.DL
            WorkTimeCalculationEngine
            C:\Users\mkharitonov\.nuget\packages\microsoft.extensions.caching.memory\2.0.0\lib\netstandard2.0\Microsoft.Extensions.Caching.Memory.dll
            C:\Users\mkharitonov\.nuget\packages\microsoft.extensions.options\2.0.0\lib\netstandard2.0\Microsoft.Extensions.Options.dll
        C:\Users\mkharitonov\.nuget\packages\system.memory\4.5.3\lib\netstandard2.0\System.Memory.dll
          Project file item includes which caused reference "C:\Users\mkharitonov\.nuget\packages\system.memory\4.5.3\lib\netstandard2.0\System.Memory.dll".
            C:\Users\mkharitonov\.nuget\packages\system.memory\4.5.3\lib\netstandard2.0\System.Memory.dll
            C:\Users\mkharitonov\.nuget\packages\system.diagnostics.diagnosticsource\4.6.0\lib\net46\System.Diagnostics.DiagnosticSource.dll
            C:\Users\mkharitonov\.nuget\packages\microsoft.applicationinsights\2.10.0\lib\net46\Microsoft.ApplicationInsights.dll
            C:\Users\mkharitonov\.nuget\packages\xyz.engine.core.common\1.0.20260.1\lib\netstandard2.0\xyz.Engine.Core.Common.dll
            xyz.Common
            C:\xyz\tip\bin.link\xyz.Web.Framework.dll
            C:\xyz\tip\bin.link\xyz.Web.Platform.dll
            AccrualEngine
            DataProcessor
            xyz.BusinessAPI.Core
            xyz.DataManager
            DataSvc
            xyz.Data
            xyz.HtmlPlatform
            xyz.BusinessAPI
            DeviceServices
            GrossPayEngineDataProvider
            MultiApprovalProcessor
            Payroll.Core.Data
            PunchStatusReconciliationEngine
            RateEngine2
            RateEngineDataProviderServer
            RuleEngine
            RuleEngineDataProvider
            RuleEngineHelper
            SharpTop.Common.Security.MemberSession
            SharpTop.DB.DL
            WorkTimeCalculationEngine
        C:\xyz\tip\Tools\MSBuild\..\..\bin.link\System.Threading.Tasks.Extensions.dll
          Project file item includes which caused reference "C:\xyz\tip\Tools\MSBuild\..\..\bin.link\System.Threading.Tasks.Extensions.dll".
            GrossPayEngineDataProvider
        C:\xyz\tip\Tools\MSBuild\..\..\bin.link\Pipelines.Sockets.Unofficial.dll
          Project file item includes which caused reference "C:\xyz\tip\Tools\MSBuild\..\..\bin.link\Pipelines.Sockets.Unofficial.dll".
            GrossPayEngineDataProvider
    References which depend on "System.Runtime.CompilerServices.Unsafe, Version = 4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" [C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\System.Runtime.CompilerServices.Unsafe.dll].

因此,我得出结论,存在两个版本的 System.Runtime.CompilerServices.Unsafe.dll
  1. NuGet 包- C:\Users\mkharitonov.nuget\packages\system.runtime.compilerservices.unsafe\4.5.2\ref\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
  2. C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\System.Runtime.CompilerServices.Unsafe.dll
二进制日志详细显示了哪些程序集依赖于 NuGet 包,但第二个引用没有显示任何内容。这很奇怪,因为问题是- 为什么会考虑第二个版本?
涉及的项目只是一个库,因此没有 app.config 文件。另外,AutoUnify == true 因此 ResolveAssemblyReference 任务应自动将冲突解析到最高版本,至少这是我的 documentation 的解释。
所以,我感到困惑。我知道警告不重要,可以忽略,但我想了解它的本质。如果显然所有依赖项都依赖于 NuGet 包,那么是什么导致它?或者说该任务不输出某些类型的依赖关系,让我调查依赖于 C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\System.Runtime.CompilerServices.Unsafe.dll 的是什么?
记录如下:
  1. NuGet 包的程序集版本为 4.0.4.1,第二个版本的程序集版本为 4.0.6.0,因此是否应解析为最高版本,即第二个版本?
  2. 我的任何代码都不直接引用 System.Runtime.CompilerServices.Unsafe,因此 ResolveAssemblyReference 任务列出的所有依赖项必须是传递性的。
  3. 我尝试向相关项目添加了 app.config 文件并提供绑定重定向,尽管由于存在 AutoGenerateBindingRedirects 属性,无需进行此操作。正如我所预料的那样- 它没有帮助。
我如何确定发生了什么以及如何修复它?

1
我们在构建服务器上将 Visual Studio 19 更新到最新版本后遇到了相同的错误。 请参考: https://github.com/xamarin/xamarin-android/issues/4872 - Marco
我的 msbuild 版本是 16.7.0+b89cb5fde。我猜我需要升级到最新版本来验证。 - mark
我遇到了与msbuild 16.9.0+57a23d249相同的问题。没有app.config文件。项目没有直接引用该文件,只是间接引用。由于nuget还原了一个不同的项目(一个包含所有nuget包的超级项目),因此正确版本的文件已经在输出目录中。即便如此,msbuild在_CopyFilesMarkedCopyLocal期间(来自C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Professional \ MSBuild \ Current \ Bin \ System.Runtime.CompilerServices.Unsafe.dll)会用旧版本的文件覆盖输出目录中的正确版本。非常烦人。尝试了一切但无法解决。 - osexpert
对我来说,这是解决方案,全局禁用复制本地(我将其放在Directory.Build.targets中):https://thomasfreudenberg.com/archive/2012/11/21/dont-copy-my-referenced-assemblies/ - osexpert
3个回答

15

我有一个更新。 在我们这边的app.config中有一个条目,将重定向到4.0.6.0。

我们以前从来没有遇到过这个问题,因为构建机器上没有4.0.6.0。

但是由于我们更新了Visual Studio到最新版本,msbuild不知何故把它复制了。

_CopyFilesMarkedCopyLocal:
  The File will be copied from "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\System.Runtime.CompilerServices.Unsafe.dll" in "D:\agent_03\_work\21\s\Release\System.Runtime.CompilerServices.Unsafe.dll".

一旦我们在配置文件中删除了该条目,该文件就不再被复制。

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
      </dependentAssembly>
</assemblyBinding>

在你的app.configs上搜索任何特定的条目。如果找不到,那么恐怕你需要浏览你所有的nuget依赖项,直到找到需要这个特定版本的那一个。

祝好, 马尔科


我没有这样的绑定重定向。它仍然发生。 - osexpert
1
如果您同时使用了 .NET Framework 和 .NET Standard,这可能对您有所帮助。https://dev59.com/zFIH5IYBdhLWcg3wb93W#59720475 - Hans
这也帮助我解决了使用NUnit进行测试时遇到的类似问题。 - ilCosmico

4

我在编译解决方案时突然遇到了相同的错误。我还原了备份并尝试了一次构建。那样做可以正常工作,但是在复制更新后的代码片段后,错误又出现了。更新Unsafe.dll包,删除引用等操作都无济于事。它总是以某种方式还原了不正确的库。

纯属偶然,我发现了问题的原因。它与一个Linq语句有关。大致如下:

MyList.ForEach(x => x.property = x.property.Replace("ABC", MyOtherList.Where(x => x.property == SomeValue).First().name)));

这在错误列表中没有引起错误。 但是,这一行会导致库Unsafe.dll不断地被添加到项目中,并且无法构建。 将第二个Linq部分中的x更改为y解决了所有问题。

MyList.ForEach(x => x.property = x.property.Replace("ABC", MyOtherList.Where(y => y.property == SomeValue).First().name)));

也许这会帮助其他人,因为这个简单的问题让我额外花了大约3小时的工作时间。

1

我遇到了一个类似的问题并解决了它。结果发现我不知怎么有三个不同版本的这个库,使用最高的版本是4.7.1,所以我把它们全部升级了一下就解决了。如果你有多个项目需要解决,可以使用NuGet 包管理器来查看你在其他项目中使用的该库,看看是否是因为这个原因导致它出现在日志中。


1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接