【问题标题】:MissingMethodException when referencing Microsoft.Build and System.IO.Compression引用 Microsoft.Build 和 System.IO.Compression 时出现 MissingMethodException
【发布时间】:2017-11-01 04:50:34
【问题描述】:

我有一个“经典桌面”.NET 项目,它引用来自 NuGet 的 Microsoft.Build 15.1 和来自 .NET SDK / GAC 的 System.IO.Compression/System.IO.Compression.FileSystem

我正在尝试将其升级到 Microsoft.Build 15.3。

Microsoft.Build 15.3 引入了对System.IO.Compression 4.1.2.0 的依赖。 .NET Framework 中System.IO.Compression 的版本是4.0.0.0。

如果我这样编译,我会收到关于无法解决程序集冲突的警告,但我的代码可以工作:

警告 MSB3277:发现同一依赖程序集的不同版本之间存在无法解决的冲突。当日志详细程度设置为详细时,这些引用冲突会列在构建日志中。

将构建日志详细程度设置为详细会产生以下输出:

1>  There was a conflict between "System.IO.Compression, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
1>      "System.IO.Compression, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.
1>      References which depend on "System.IO.Compression, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" [C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.IO.Compression.dll].
1>          C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.IO.Compression.dll
1>            Project file item includes which caused reference "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.IO.Compression.dll".
1>              System.IO.Compression
1>      References which depend on "System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" [C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\System.IO.Compression.dll].
1>          C:\Temp\CompressionMissingMethod\packages\Microsoft.Build.15.3.409\lib\net46\Microsoft.Build.dll
1>            Project file item includes which caused reference "C:\Temp\CompressionMissingMethod\packages\Microsoft.Build.15.3.409\lib\net46\Microsoft.Build.dll".
1>              Microsoft.Build, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(1988,5): warning MSB3277: Found conflicts between different versions of the same dependent assembly that could not be resolved.  These reference conflicts are listed in the build log when log verbosity is set to detailed.

我可以通过将 SDK/GAC 对 System.IO.Compression 的引用替换为 NuGet 引用来解决警告。但是,一旦我这样做,当 JIT 到达该方法时,使用 ZipFile 的代码就会崩溃并出现 MissingMethodException

未处理的异常:System.MissingMethodException:找不到方法:'System.IO.Compression.ZipArchive System.IO.Compression.ZipFile.OpenRead(System.String)'。 在 CompressionMissingMethod.Program.Main(String[] args)

我整理了一个非常简单的 repro case 来说明这种行为(查看分支)。

有没有什么方法可以同时引用Microsoft.Build 15.3 和System.IO.Compression 而不会出现错误、警告或异常?

【问题讨论】:

  • 您使用的是旧的 .Net 框架吗?请参阅this SO 问题。
  • @JeroenHeier 不。该项目针对 4.6.1,我正在运行 4.7.1。
  • 对于您的复制案例,我采用了 15.3-missingmethod 分支(我能够复制缺少的方法异常),右键单击解决方案资源管理器中的项目节点,选择管理 NuGet 包。它提出了 10 个更新,我已经完成了这些更新,现在它似乎正在工作。

标签: c# .net msbuild nuget clr


【解决方案1】:

要修复 MSB3277 警告指示的问题(以及缺少方法异常问题) - 您需要将绑定重定向添加到您的 app.config 文件,以便所有绑定都重定向到最后一个版本(在这种情况下为 4.1.2.0 ):

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <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>
  </assemblyBinding>
</runtime>

所以,安装 Microsoft.Build 15.3,从 nuget 安装 System.IO.Compression(这会将您的状态移动到 MissingMethodException 情况),然后在上面添加重定向,异常就会消失,一切都会正常工作而不会出现异常或警告。

cmets 中建议的替代方案是将所有软件包更新到最新版本 - 由于相同的原因,这也有效 - 绑定重定向。如果您更新所有包然后重建 - 大量重定向将添加到您的配置中,包括 System.IO.Compression 的重定向(但到版本 4.2.0.0)。请注意,这些重定向不会添加到您的 app.config 中,而是直接添加到输出 YourAppName.exe.config 文件中。

【讨论】:

  • 刚刚测试过,效果很好。我通过一起提取 ZipFile 类走更长的路,没有意识到可以完成 bindingRedirect。感谢您的信息
  • 奇怪,我试过这个但没有效果。我想我会以某种方式把它塞满。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多