程序集绑定错误:绑定结果:hr = 0x80070002。系统找不到指定的文件。

11
我有一个Visual Studio 2010解决方案,其中包含一个类库(ProjectA)和两个Sharepoint项目(ProjectB和ProjectC)。依赖关系顺序是ProjectB引用ProjectA,而ProjectC引用ProjectA和ProjectB。
在某个特定的开发机器上,当尝试构建ProjectC时,我会收到以下错误:
“编译失败。无法加载所请求的一个或多个类型。请检索LoaderExceptions属性以获取更多信息。”
查看融合日志时,我注意到以下错误:

* 汇编绑定日志条目(2012年6月14日@ 09:38:32)*

操作失败。

绑定结果:hr = 0x80070002。系统找不到指定的文件。

程序集管理器加载自:C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll

在可执行文件下运行:C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe

---详细错误日志如下。

=== 预先绑定状态信息 === LOG: 用户=DOMAIN\username

LOG: DisplayName = ProjectB,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = aaaaaaaaaaaaaaaa,processorArchitecture = MSIL (完全指定)

LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/

LOG: 初始PrivatePath = NULL

LOG: 动态基础 = NULL

LOG: 缓存基础 = NULL

LOG: AppName = devenv.exe

调用程序集:(未知)。

LOG: 此绑定在默认加载上下文中开始。

LOG: 使用应用程序配置文件:C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.Config

LOG: 使用主机配置文件:

LOG: 使用来自C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config的计算机配置文件。

LOG: 后策略引用:ProjectB,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = aaaaaaaaaaaaaaaa,processorArchitecture = MSIL

LOG: GAC查找失败。

LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ProjectB/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PublicAssemblies/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PublicAssemblies/ProjectB/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/ProjectB/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/ProjectB/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/ProjectB/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/x86/ProjectB.DLL。 LOG: 尝试下载新的URL文件:///C:/Program Files (x86)/Microsoft Visual Studio 10

我已经尝试过以下方法:
1. 删除对 ProjectB 的引用并重新添加引用,包括: a) 作为项目引用 b) 直接作为指向 ProjectB 调试文件夹的手动引用
2. 手动将 ProjectB.dll 放入 GAC 中
3. 将 "Copy Local" 选项从 True 更改为 False (然后再改回 True)
只有第二种方法(将程序集放入 GAC)才能让 ProjectC 构建成功。
为什么它不能按照应有的方式找到程序集(而在其他计算机上可以)?

所有的机器都是64位的吗?还是只有这一台? - Paul Phillips
所有的服务器都是64位的Windows Server 2008 R2。 - mundeep
2个回答

6

PublicKeyToken = aaaaaaaaaaaaaaaa 可能不同,或者程序集的版本号也可能不同。我认为你应该按照 Fusion Log Viewer to Debug 的说明进行操作,希望你能解决自己的问题。


2
a) Fusion Log 的意思是它检查 GAC,然后检查 IDE 文件夹而不是项目 bin 文件夹。但我对此并不理解。 b) 如上所述,如果我手动将 ProjectB 程序集放入 GAC 中,它就会被找到(这意味着密钥是正确的)- 我刚刚手动检查过(sn -T),密钥是相同的。 - mundeep
你能否粘贴一下你使用(sn-T)检查过的密钥以及程序集的版本号? - MMK
我已经从GAC中删除了ProjectB dll并尝试重新构建,但是在融合中出现以下错误: === 预绑定状态信息 === LOG: 用户 = DOMAIN\username LOG: DisplayName = ProjectB, Version=0.0.0.0, Culture=neutral, PublicKeyToken=e72f8d3506b83180, processorArchitecture=MSIL(完全指定) LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ ... ... LOG: 后置策略引用: ProjectB,Version=0.0.0.0,Culture=neutral,PublicKeyToken=e72f8d3506b83180,processorArchitecture=MSIL LOG: GAC查找失败。 - mundeep
进入ProjectB的bin/debug文件夹并运行sn -T,我得到了这个结果:“公钥令牌为e72f8d3506b83180”(右键单击dll文件的属性显示版本为0.0.0.0)。将此程序集直接从bin文件夹放入GAC后,我可以在没有错误的情况下构建ProjectC。 - mundeep
这对我没有用,因为找不到的引用是一个刚刚构建的项目引用!文件需要在GAC中根本没有意义。必须有更好的解释为什么搜索路径被限制了。 - Shiv

5
所以,事实证明无法找到程序集的原因是因为我们正在延迟签名程序集。这意味着:
因为程序集没有有效的强名称签名,该签名的验证必须被关闭。您可以使用Strong Name工具的-Vr选项来完成此操作。
我已经为所有所需的公钥执行了此操作,但仅在x64 Visual Studio命令提示符中。我还需要在Visual Studio命令提示符的x86版本中添加验证跳过。
我之所以能够找到这个问题,是因为尝试使用特定的命令构建/部署脚本时,我注意到其中一个测试程序集出现了以下异常:
无法加载文件或程序集“ProjectC.Tests,Version = 0.0.0.0, Culture = neutral,PublicKeyToken = e72f8d3506b83180”或其 其中一个依赖项。强名称验证失败。(HRESULT异常代码:0x8013141A)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接