引用Microsoft.Build和System.IO.Compression

时间:2017-11-01 04:50:34

标签: c# .net msbuild nuget clr

我有一个“经典桌面”.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:发现无法解析的相同从属程序集的不同版本之间发生冲突。当日志详细程度设置为详细信息时,这些引用冲突将在构建日志中列出。

将构建日志详细程度设置为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.

我可以通过使用NuGet引用替换SDK / GAC对System.IO.Compression的引用来解决警告。但是,当我执行此操作时,当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而没有错误,警告或例外?

1 个答案:

答案 0 :(得分:9)

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

<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案例),然后在上面添加重定向,异常将消失,事情将无异常或警告。< / p>

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