【发布时间】: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 个更新,我已经完成了这些更新,现在它似乎正在工作。