2

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

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

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

PerformanceRunner.exe 然后成功地加载了驻留在 ExecutablePath 中的几个非托管 DLL(这可以通过查看 VS 中的 Modules 窗口来验证)。然后它尝试加载也位于 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

日志:DisplayName = TpssCDQ,版本=1.0.4612.26218,文化=中性,PublicKeyToken=null(完全指定)

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

日志:初始 PrivatePath = NULL

日志:动态基数 = NULL

日志:缓存基础 = NULL

日志:AppName = PerformanceRunner.exe

调用程序集:(未知)。

===

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

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

LOG:使用主机配置文件:

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

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

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

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

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

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

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


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

4

1 回答 1

0

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

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

其他要检查的事项:

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

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

于 2012-11-30T08:36:58.440 回答