【问题标题】:Assembly load failure装配负载失败
【发布时间】:2012-11-18 03:21:35
【问题描述】:

我遇到了由衍生的混合模式进程引起的托管程序集负载问题。详情见下文。假设 BinPath 和 ExecutablePath 是两个不同的有效路径。

我有一个在 BinPath 中启动的 Web 应用程序,并使用以下 ProcessStartInfo 创建了一个进程:

new ProcessStartInfo()
{
    FileName = ExecutablePath + "PerformanceRunner.exe",
    WorkingDirectory = ExecutablePath ,
    UseShellExecute = true                
};

PerformanceRunner.exe 然后成功加载驻留在 ExecutablePath 中的几个非托管 DLL(这可以通过查看 VS 中的“模块”窗口来验证)。然后它尝试加载也位于 ExecutablePath 中的托管程序集,但这失败了。这是这个的融合日志 - 注意 BinPath 是“G:\TOPSS\TOPSS New\Common\Service\Bin”,托管程序集是 TPSSCDQ.dll。 TPSSCDQ 驻留在 ExecutablePath 中。


* 组装活页夹日志条目(11/29/2012 @ 4:16:11 PM)*

操作失败。绑定结果:hr = 0x80070002。系统无法 找到指定的文件。

程序集管理器从以下位置加载: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll 下运行 可执行 G:\TOPSS\TOPSS New\Common\Service\Bin\PerformanceRunner.exe


=== 预绑定状态信息 ===

日志:用户 = CORP\lbhra

LOG:DisplayName = TpssCDQ,Version=1.0.4612.26218,Culture=neutral, PublicKeyToken=null(完全指定)

LOG:Appbase = file:///G:/TOPSS/TOPSS New/Common/Service/Bin/

LOG:初始 PrivatePath = NULL

LOG:动态基数 = NULL

LOG:缓存基础 = NULL

日志:AppName = PerformanceRunner.exe

调用程序集:(未知)。

===

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

LOG:未找到应用程序配置文件。

LOG:使用主机配置文件:

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

LOG:此时未将策略应用于参考(私有、 自定义、部分或基于位置的程序集绑定)。

LOG:正在尝试下载新的 URL 文件:///G:/TOPSS/TOPSS New/Common/Service/Bin/TpssCDQ.DLL。

LOG:正在尝试下载新的 URL 文件:///G:/TOPSS/TOPSS New/Common/Service/Bin/TpssCDQ/TpssCDQ.DLL。

LOG:正在尝试下载新的 URL 文件:///G:/TOPSS/TOPSS New/Common/Service/Bin/TpssCDQ.EXE。

LOG:正在尝试下载新的 URL file:///G:/TOPSS/TOPSS New/Common/Service/Bin/TpssCDQ/TpssCDQ.EXE。

LOG:所有探测 URL 都已尝试并失败。


我不完全了解 PrivatePath、Appbase 或 Dynamicbase 是什么,但这些路径中的至少一个不应该是工作目录(ExecutablePath)吗?我已经使用 GetCurrentDirectory 验证了工作目录设置正确。我真的很感激这个,因为我很困惑。

【问题讨论】:

    标签: c# c++ process .net-assembly mixed-mode


    【解决方案1】:

    你是对的,它应该在存储可执行文件的根文件夹中查找。它不会在工作目录中查找 - 但我理解在这种情况下,这些路径是相同的。如果您查看错误消息,APPBASE 设置正确,所以我认为它在正确的位置,但由于其他原因没有找到它。

    http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.90).aspx

    其他需要检查的事项:

    • 您的应用程序/机器配置文件中是否有任何程序集加载提示?
    • 托管 DLL 是否针对正确的平台构建?
    • 托管 DLL 是否已重命名 - 文件名是否与清单匹配?
    • 是否所有托管 DLL 的依赖项都存储在同一位置?

    另外,你是如何加载这个程序集的?它是作为项目的引用列出的,还是您在调用 Assembly.Load(或类似名称)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2010-10-21
      • 1970-01-01
      • 2013-12-25
      相关资源
      最近更新 更多