3

有谁知道什么会导致 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,尽管这些是在该机器上构建的

4

1 回答 1

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。

我可能会走得很远,但这是要尝试的几件事。

于 2009-09-17T22:00:04.747 回答