装配负载失败

时间:2012-11-29 22:46:50

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

我遇到了源自混合模式进程的托管程序集加载问题。请参阅下文了解详情。假设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新\ Common \ Service \ Bin \ PerformanceRunner.exe

     
     

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

     

日志:用户= CORP \ lbhra

     

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

     

日志:Appbase = file:/// G:/ TOPSS / TOPSS新/公共/服务/ Bin /

     

日志:初始PrivatePath = NULL

     

日志:动态基础=空白

     

LOG :Cache Base = NULL

     

日志:AppName = PerformanceRunner.exe

     

调用程序集:(未知)。

     

===

     

日志:此绑定在默认加载上下文中启动。

     

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

     

日志:使用主机配置文件:

     

日志:使用来自的计算机配置文件   C:\的Windows \ Microsoft.NET \框架\ v4.0.30319 \ CONFIG \ machine.config中

。      

日志:此时政策未应用于参考(私人,   自定义,部分或基于位置的程序集绑定)。

     

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

     

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

     

日志:尝试下载新的网址文件:/// G:/ TOPSS / TOPSS   新/常用/服务/滨/ TpssCDQ.EXE。

     

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

     

日志:所有探测网址都已尝试失败。

     

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

1 个答案:

答案 0 :(得分:0)

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

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

其他要检查的事项:

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

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