【问题标题】:Fusion loader can't find a DLL that is actually thereFusion loader 找不到实际存在的 DLL
【发布时间】:2009-09-17 21:24:23
【问题描述】:

有谁知道什么会导致 Fusion 加载程序在没有警告或确认的情况下简单地跳过 DLL?

当我尝试从命令行应用程序(在 C# 中)执行此操作时

Assembly.LoadFrom("c:\\Deploy\\bin\\WebServices.dll")

我看到了:

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

该 DLL 依赖于 Platform.DLL,但该依赖项的加载失败,因此这行代码会引发异常。当我检查 Fusion 程序集加载消息时,我看到的是:

=== 预绑定状态信息 === 日志:DisplayName = Platform,Version=9.0.0.0,Culture=neutral,PublicKeyToken=null(完全指定) ... LOG:此绑定在 LoadFrom 加载上下文中开始。 警告:将不会在 LoadFrom 上下文中探测本机图像。本机映像只会在默认加载上下文中进行探测,例如使用 Assembly.Load()。 LOG:未找到应用程序配置文件。 LOG:使用 C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\config\\machine.config 中的机器配置文件。 LOG:此时未将策略应用于引用(私有、自定义、部分或基于位置的程序集绑定)。 日志:正在尝试下载新的 URL 文件:///C:/Project/bin/Debug/Platform.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Project/bin/Debug/Platform/Platform.DLL。 日志:正在尝试下载新的 URL 文件:///C:/Project/bin/Debug/Platform.EXE。 日志:正在尝试下载新的 URL 文件:///C:/Project/bin/Debug/Platform/Platform.EXE。 日志:正在尝试下载新的 URL 文件:///c:/Deploy/bin/Platform.DLL。 日志:正在尝试下载新的 URL 文件:///c:/Deploy/bin/Platform/Platform.DLL。 日志:正在尝试下载新的 URL 文件:///c:/Deploy/bin/Platform.EXE。 日志:正在尝试下载新的 URL 文件:///c:/Deploy/bin/Platform/Platform.EXE。

问题是,DLL 存在于c:\Deploy\bin\Platform.DLL,具有正确的版本且没有签名的公钥。

我想到的事情:
1.可能真的是Platform.DLL的依赖坏了,导致了这种行为? (我在 Reflector 中追查了依赖树,但没有发现丢失的 DLL)
2. 可能是发布/调试不匹配,或者 64 位与 32 位?但一切都建立在同一台机器上
3. 也许我误读了日志,但是当它遇到它找到的 DLL 时它不应该停止吗?我在此日志中看不到“成功”或“不成功”消息。我只知道它因为异常而失败。

PS 更多技术细节:
机器环境是 Windows 2008 64 位,安装了 .NET 2.0、3.0 和 3.5。
相同的应用程序在另一台机器(Vista 32 位)上运行良好,具有相同的目录结构和 DLL,尽管它们是在那台机器上构建的

【问题讨论】:

    标签: c# .net assemblies fusion


    【解决方案1】:

    是的,它应该在找到所需的 dll 时停止,因此第五个“正在尝试下载...”应该已经找到它...

    但是,命令行应用程序是从哪里运行的?如果是 Debug 文件夹,那么您可以尝试以下几件事

    1. 将依赖的 dll 放在同一个文件夹中
    2. 通过以下格式的 .config 文件对程序集和引用进行签名

      <dependentAssembly>
          <assemblyIdentity name="WebServices.dll" publicKeyToken="<whatever this public key it>" />
          <codeBase version="1.0.0.0" href="..\WebServices.dll" />
      </dependentAssembly>
      
    3. 签署它们,然后将依赖程序集放入 GAC。

    我可能会走得很远,但这是一些可以尝试的事情。

    【讨论】:

    • 感谢您的想法。我在原始问题中添加了更多信息 - 这个相同的应用程序确实可以在另一台机器上运行(尽管操作系统不同)。所涉及的 EXE/DLL 各自构建在不同的机器上,但它们都具有相同的大小。我会尝试将依赖项本地复制到 bin\debug 目录中,但最后它必须能够从另一个目录运行:( 谢谢!
    • 没关系,它可以从另一个目录运行,但我相信它需要签名,以便可以像上面第 2 项一样将其添加到配置文件中。
    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多