引用Microsoft.Build和System.IO.Compression时出现MissingMethodException

yaa*_*kov 5 .net c# msbuild clr nuget

我有一个"经典桌面".NET项目,它引用Microsoft.Build了NuGet和System.IO.Compression/ System.IO.Compression.FileSystem或.NET SDK/GAC中的15.1 .

我正在尝试将其升级到Microsoft.Build15.3.

Microsoft.Build15.3引入了对System.IO.Compression4.1.2.0 的依赖.System.IO.Compression.NET Framework中的版本是4.0.0.0.

如果我像这样编译,我收到一个警告,无法解决程序集冲突,但我的代码工作:

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

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

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.
Run Code Online (Sandbox Code Playgroud)

我可以通过将SDK/GAC引用替换System.IO.Compression为NuGet引用来解决警告.但是,只要我执行此操作,代码就会在JIT到达该方法时使用ZipFile崩溃MissingMethodException.

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

我已经整理了一个非常小的repro案例,说明了这种行为(查看分支).

有没有办法引用Microsoft.Build15.3并且System.IO.Compression没有错误,警告或异常?

Evk*_*Evk 9

要修复由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>
Run Code Online (Sandbox Code Playgroud)

因此,安装Microsoft.Build 15.3,从nuget安装System.IO.Compression(将状态移动到MissingMethodException的情况),然后在上面添加重定向,异常将消失,事情将无异常或警告.

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