【发布时间】:2017-09-23 00:35:59
【问题描述】:
我有一个包含天蓝色云项目和工作者角色项目(+ 一些辅助项目)的解决方案。 当我在本地调试工作人员时,我得到了这个异常:
无法加载文件或程序集“System.Runtime.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)":"System.Runtime.Extensions,版本=4.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a
融合日志:
=== Pre-bind state information ===
LOG: DisplayName = System.Runtime.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
LOG: Appbase = file:///C:/Azure/roles/[worker project]/approot
LOG: Initial PrivatePath = C:\Azure\roles\[worker project]\approot
Calling assembly : Microsoft.Extensions.Configuration, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Azure\roles\[worker project]\approot\[worker assembly].dll.config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Redirect found in application configuration file: 4.0.0.0 redirected to 4.1.1.0.
LOG: Post-policy reference: System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
LOG: Attempting download of new URL file:///C:/Azure/roles/[worker project]/approot/System.Runtime.Extensions.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Minor Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
我在构建输出中看到的内容:
2> Task "Message"
2> CopyLocalDependencies=[solution]\packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll
2> Task "Message"
2> CopyLocalDependencies=C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2\Facades\System.Runtime.Extensions.dll
...
2> Task "Message"
2> WorkerFiles=[solution]\packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll -> System.Runtime.Extensions.dll
2> Task "Message"
2> WorkerFiles=C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2\Facades\System.Runtime.Extensions.dll -> System.Runtime.Extensions.dll
...
2> Copying file from "[solution]\packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll" to "[solution]\[azure project]\obj\Debug\[worker project]\System.Runtime.Extensions.dll".
2> Copying file from "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2\Facades\System.Runtime.Extensions.dll" to "[solution]\[azure project]\obj\Debug\[worker project]\System.Runtime.Extensions.dll".
为什么 MSBuild 将 GAC 的程序集复制到本地文件夹?如何改变这种行为?我没有直接引用 GAC 的 System.Runtime.Extensions。 或者如何改变复制程序集的顺序?
我尝试了什么:
- 在worker项目中添加属性DoNotCopyLocalIfInGac = true
- 添加对 nuget 包 System.Runtime.Extensions 的直接引用
UPD 发现类似问题
【问题讨论】:
-
看起来你在放弃之前已经对它进行了大量的黑客攻击,需要猜测。我假设您最好从 app.config 文件中删除 BindingRedirect 以强制加载 4.1.1.0 以使其正常化。程序集引用上的 Copy Local=true 也需要重置。这是一个可重定向的程序集,它应该从 GAC 加载 4.0.0.0。
-
@HansPassant 它有所帮助,但我担心有一天或其他时候我会因为旧程序集而得到异常“System.MissingMethodException:找不到方法......”。一些 nuget 包依赖于 System.Runtime.Extensions 包。删除 bindingRedirects (默认自动添加)也很费力,因为我必须一个一个删除重定向 - 一些其他重定向是必要的,因为 nuget 程序集已正确复制到 approot 文件夹中。
-
我需要一种方法来停止复制 GAC 的程序集或设置复制顺序(首先从 GAC,然后从包)。
-
避免 MissingMethodException 是这些可重定向程序集的确切要点。您正试图击败旨在让您摆脱这种麻烦的功能。您需要停止与之抗争并解释真正的问题是什么样的。 “我怕有一天……”不是这里任何人都能解决的真正问题。
-
@HansPassant 我只是指出了我的问题的这种解决方案的副作用。真正的问题是 MSBuild 很难从不同的来源选择相同的程序集,即 MSBuild 做出了错误的决定采用哪个版本。实际上,MSBuild 获取所有版本并将它们复制到输出文件夹中。就我而言,复制的顺序很重要。
标签: .net azure visual-studio-2015 msbuild