【问题标题】:Assembly Binding Error: Bind result: hr = 0x80070002. The system cannot find the file specified程序集绑定错误:绑定结果:hr = 0x80070002。该系统找不到指定的文件
【发布时间】:2012-06-14 09:44:05
【问题描述】:

我有一个 Visual Studio 2010 解决方案,其中包含一个类库 (ProjectA) 和两个 Sharepoint 项目(ProjectB 和 ProjectC)。依赖顺序是 ProjectB 引用 ProejctA 和 ProjectC 引用 ProjectA 和 ProjectB。

在一台特定的开发机器上尝试构建 ProjectC 时出现以下错误:

编译失败。无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。

查看融合日志时,我注意到以下错误:

* 组装活页夹日志条目 (14/06/2012 @ 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 下运行

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

=== 预绑定状态信息 === 日志:用户 = 域\用户名

日志:DisplayName = ProjectB,版本=0.0.0.0,文化=中性,PublicKeyToken=aaaaaaaaaaaaaaaa,处理器架构=MSIL (完全指定)

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

日志:初始 PrivatePath = NULL

日志:动态基数 = NULL

日志:缓存基础 = NULL

日志: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 中的机器配置文件。

日志:策略后参考:ProjectB,版本=0.0.0.0,文化=中性,PublicKeyToken=aaaaaaaaaaaaaaaa,处理器架构=MSIL

日志:GAC 查找失败。

LOG:正在尝试下载新的 URL file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ProjectB/ProjectB.DLL。 日志:正在尝试下载新的 URL file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PublicAssemblies/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PublicAssemblies/ProjectB/ProjectB.DLL。 日志:尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/ProjectB/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/ProjectB/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/ProjectB.DLL。 日志:尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/ProjectB/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/x86/ProjectB.DLL。 日志:尝试下载新的 URL file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/x86/ProjectB/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/Editor/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/Editor/ProjectB/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Platform/Debugger/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Platform/Debugger/ProjectB/ProjectB.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ProjectB.EXE。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/ProjectB/ProjectB.EXE。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PublicAssemblies/ProjectB.EXE。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PublicAssemblies/ProjectB/ProjectB.EXE。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/ProjectB.EXE。 日志:正在尝试下载新的 URL file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/ProjectB/ProjectB.EXE。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/ProjectB.EXE。 日志:尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/TemplateProviders/ProjectB/ProjectB.EXE。 日志:正在尝试下载新的 URL file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/ProjectB.EXE。 日志:正在尝试下载新的 URL file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/ProjectB/ProjectB.EXE。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/x86/ProjectB.EXE。 日志:正在尝试下载新的 URL file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/PrivateAssemblies/DataCollectors/x86/ProjectB/ProjectB.EXE。 日志:正在尝试下载新的 URL file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/Editor/ProjectB.EXE。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Microsoft/Editor/ProjectB/ProjectB.EXE。 日志:正在尝试下载新的 URL 文件:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Platform/Debugger/ProjectB.EXE。 日志:正在尝试下载新的 URL file:///C:/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/CommonExtensions/Platform/Debugger/ProjectB/ProjectB.EXE。 LOG:所有探测 URL 都已尝试并失败。

我试过了:

  1. 删除对 ProjectB 的引用并重新添加:
    • a) 作为项目参考
    • b) 作为手动参考,直接指向projectB的debug文件夹
  2. 手动将 ProjectB.dll 放入 GAC 中
  3. 将“复制本地”选项从 True 更改为 False(并返回 True)

并且只有 (2) 将程序集放在 GAC 中才能构建 ProjectC。 为什么它没有找到应有的程序集(并且在其他机器上)?

【问题讨论】:

  • 所有机器都是 64 位的还是只有这台机器?
  • 都是 64 位 Windows Server 2008 R2

标签: c# .net-assembly assembly-resolution


【解决方案1】:

PublicKeyToken=aaaaaaaaaaaaaaaa 可以不同,也可能是程序集的版本号不同。我认为您应该按照描述使用 Fusion Log Viewer to Debug,并希望您能完全解决您的问题。

【讨论】:

  • a) Fusion Log 高于我可以理解的是它检查 GAC,然后出于某种原因检查 IDE 文件夹而不是项目 bin 文件夹。 (b) 如上所述,如果我手动将 ProjectB 程序集放入 GAC 中,则会找到它(这意味着密钥是正确的) - 我刚刚手动检查了 (sn -T) 并且密钥是相同的。
  • 你能粘贴你使用(sn-T)检查过的密钥以及程序集的版本号吗?
  • 所以我从 GAC 中删除了 ProjectB dll 并尝试再次构建我在 fusion 中得到以下信息:=== 预绑定状态信息 === LOG: User = DOMAIN\username LOG: DisplayName = ProjectB、Version=0.0.0.0、Culture=neutral、PublicKeyToken=e72f8d3506b83180、processorArchitecture=MSIL(完全指定)日志: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 查找不成功。
  • 进入 ProjectB 的 bin/debug 文件夹并运行 sn -T 我得到:“公钥令牌是 e72f8d3506b83180”(右键单击 dll 的属性显示版本 0.0.0.0)。将此程序集直接从 bin 文件夹放入 GAC 后,我可以构建 ProjectC 而不会出现错误。
  • 这对我没有用,因为找不到的引用是刚刚构建的项目引用!文件需要在 GAC 中从字面上看是没有意义的。必须有一个更好的解释来解释为什么搜索路径是 gimped。
【解决方案2】:

原来无法找到程序集的原因是因为我们是Delayed Signing the Assemblies 这意味着:

由于程序集没有有效的强名称签名,因此必须关闭对该签名的验证。您可以通过使用带有强名称工具的 –Vr 选项来执行此操作。

我已经为所有必需的公钥完成了此操作,但仅在 x64 Visual Studio 命令提示符下完成。我还需要在 Visual Studio 命令提示符的 x86 版本中添加 x86 的验证跳过。

我之所以能找到这个,是因为在尝试基于特定命令的构建/部署脚本时,我注意到其中一个测试程序集出现以下异常:

无法加载文件或程序集 'ProjectC.Tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=e72f8d3506b83180' 或其其中之一 依赖项。强名称验证失败。 (HRESULT 的例外情况: 0x8013141A)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多