【发布时间】:2010-11-16 03:23:42
【问题描述】:
我正在追查最近弹出的程序集加载/绑定错误。在我的调查中,我发现了一个令人困惑的矛盾(假设我正确解析了融合日志)。
我的应用程序在启动时抛出的异常状态:
{“无法加载文件或程序集 'Microsoft.Practices.CompositeUI, Version=1.0.51205.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)":"Microsoft.Practices.CompositeUI,版本=1.0.51205.0,文化=中性,PublicKeyToken=31bf3856ad364e35"}
我最近所做的一些项目更改不需要强命名程序集“Microsoft.Practices.CompositeUI”。在确认我的所有解决方案项目确实引用了未签名的程序集后,我启动了dependency browser 以确保我没有遗漏任何东西。一切都检查过了,我确认我没有对旧程序集的任何“旧”引用。当然,我也清理并重建了我的项目。
然后我进一步研究并启动了融合日志查看器 (Fuslogvw.exe) 并将其配置为显示绑定错误。我查看了日志,发现绑定错误。详细日志是混乱开始的地方;它将“调用程序集”列为对缺少的程序集没有绑定(我可以确定)的程序集。啊,很难解释。这是日志:
* 组装活页夹日志条目(11/15/2010 @ 7:00:18 PM)*
操作失败。
绑定结果:hr = 0x80131040。没有可用的描述。
程序集管理器从以下位置加载:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 在可执行文件 C:\Program Files\PMT\Office App\1.1.1.7\OfficeApp.exe 下运行
--- 详细的错误日志如下。
=== 预绑定状态信息 ===
日志:用户 = PMD\sklett
日志:DisplayName = Microsoft.Practices.CompositeUI,版本=1.0.51205.0,文化=中性,PublicKeyToken=31bf3856ad364e35 (完全指定)
LOG: Appbase = file:///C:/Program Files/PMT/Office App/1.1.1.7/
日志:初始 PrivatePath = NULL
日志:动态基数 = NULL
日志:缓存基础 = NULL
日志:AppName = OfficeApp.exe
调用程序集:Microsoft.Practices.EnterpriseLibrary.Common,Version=4.1.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35。
===
LOG:此绑定在默认加载上下文中开始。
LOG:使用应用程序配置文件:C:\Program Files\PMT\Office App\1.1.1.7\OfficeApp.exe.config
LOG:使用 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config 中的机器配置文件。
日志:政策后参考:Microsoft.Practices.CompositeUI,Version=1.0.51205.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35
日志:GAC 查找失败。
LOG:正在尝试下载新的 URL file:///C:/Program Files/PMT/Office App/1.1.1.7/Microsoft.Practices.CompositeUI.DLL。
LOG:程序集下载成功。尝试设置文件:C:\Program Files\PMT\Office App\1.1.1.7\Microsoft.Practices.CompositeUI.dll
LOG:进入从源代码运行设置阶段。
LOG:程序集名称为:Microsoft.Practices.CompositeUI,版本=1.0.51205.0,Culture=neutral,PublicKeyToken=null
警告:比较程序集名称导致不匹配:PUBLIC KEY TOKEN
ERR:程序集引用与找到的程序集定义不匹配。
ERR:无法完成程序集设置 (hr = 0x80131040)。探测终止。
现在调用程序集“Microsoft.Practices.EnterpriseLibrary.Common”没有任何列出的(通过依赖项浏览器)对“Microsoft.Practices.CompositeUI”的依赖项。不仅如此,它也不应该有。
融合日志阻止了我,融合日志导致混乱! ;0)
希望我为一些明智的专家提供了足够的信息,让我知道我缺少什么。
【问题讨论】:
-
您为什么不希望有对 Microsoft.Practices.CompositeUI 的强名称引用?您是否在没有 SNK 的情况下自己重新编译并更改了所有项目引用?
-
另外,我认为您的 GAC 中没有 Microsoft.Practices.CompositeUI 的强命名副本?
-
@JeffN825 - “您是否在没有 SNK 的情况下自行重新编译并更改了所有项目引用?”是的,这正是我所做的。我还检查了 GAC (gacutil -l),没有列出任何 P&P 程序集。
-
EntLib Common 试图加载程序集并不意味着它正在引用它。考虑使用反射按名称解析类型的场景。完整的堆栈跟踪在这里可能会有所帮助。
-
你有没有安装notepad++之类的?我建议搜索解决方案目录中所有文件的内容(包括 csproj 文件,这就是您需要使用外部程序的原因)以查找字符串“31bf3856ad364e35”。