我有一个“经典桌面”.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的依赖关系。System.IO.Compression框架中的.NET版本为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.我可以通过用System.IO.Compression引用替换SDK/GAC引用来解决警告。但是,一旦我这样做,使用ZipFile的代码就会在JIT到达该方法时与MissingMethodException一起崩溃。
未处理异常: System.MissingMethodException:方法未找到:'System.IO.Compression.ZipArchive System.IO.Compression.ZipArchive在CompressionMissingMethod.Program.Main(String[] args)
我已经设置了一个非常小的复述案件,它说明了这种行为(查看分支)。
有没有任何方法可以同时引用Microsoft.Build 15.3和System.IO.Compression,而不存在错误、警告或异常?
发布于 2017-11-06 09:03:45
要修复由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大小写),然后在上面添加重定向,异常就会消失,所有事情都会正常工作,没有异常或警告。
注释中建议的另一种方法是将所有包更新为最新版本--这也是因为同样的原因--绑定重定向。如果您更新了所有包,那么将重新构建--大量重定向将添加到您的配置中,包括System.IO.Compression的重定向(但版本为4.2.0.0)。注意,这些重定向不会添加到您的app.config中,而是直接添加到输出YourAppName.exe.config文件中。
https://stackoverflow.com/questions/47048438
复制相似问题