使用C ++ / CLI层的.Net可执行文件获取System.BadImageFormatException

时间:2013-08-26 20:06:46

标签: c++-cli badimageformatexception

对于处理c ++ / cli的人来说,这个问题似乎很常见,但我遗漏了一些典型的解析路径。我有一个.Net程序集,PHD.exe,它引用了c ++ / CLI dll。此DLL动态链接许多win32本机dll。

例外文字:

  

主窗口异常:'X.BLCInterfaceBehavior'的类型初始值设定项引发异常。 System.BadImageFormatException:无法加载文件或程序集“CppCLI.dll”或其依赖项之一。不是有效的Win32应用程序。 (HRESULT异常:0x800700C1)

根据SO的其他建议,我检查可执行文件的目标类型。右键单击>属性>构建标签>平台= x86。平台目标:x86。

同样,我检查c ++ / cli dll的项目属性(我希望这是正确的位置):属性>配置属性>链接器>目标机器= MachineX86

我在CppCLI.dll上运行了DependencyWalker,并收到以下错误:

  

错误:由于隐式相关模块中缺少导出功能,至少有一个模块具有未解析的导入。

     

错误:找到了具有不同CPU类型的模块。   警告:由于延迟加载相关模块中缺少导出功能,至少有一个模块具有未解析的导入。

我不确定如何识别哪个DLL缺少预期的导出功能,或者这只是x64系统上的这个depends.exe怪癖中的一个。同样的事情适用于具有diff cpu类型的模块 - 我想我已经在SO上看到了“忽略”消息。

我针对winDBG运行应用程序,并看到一些Windows DLL正在从SysWOW64加载 - 这似乎是错误的。一些例子:

  

ModLoad:75880000 75910000 C:\ Windows \ syswow64 \ GDI32.dll

     

ModLoad:753f0000 753fa000 C:\ Windows \ syswow64 \ LPK.dll

     

ModLoad:76c60000 76cfd000 C:\ Windows \ syswow64 \ USP10.dll

     

ModLoad:76d00000 76da0000 C:\ Windows \ syswow64 \ ADVAPI32.dll

     

ModLoad:75fe0000 76c2a000 C:\ Windows \ syswow64 \ SHELL32.dll

这些不应该从System32加载吗?

最后,WinDBG显示了异常,但我没有看到任何有用的东西:

  

ModLoad:6dfc0000 6e060000 GambitManagedWrapper.dll

     

ModLoad:01270000 01310000 GambitManagedWrapper.dll

     

ModLoad:72eb0000 72ebe000 C:\ Windows \ SysWOW64 \ RpcRtRemote.dll

     

ModLoad:6dfc0000 6e060000 C:\ Gambit \ GambitManagedWrapper.dll

     

(fbc.ebc):C ++ EH异常 - 代码e06d7363(第一次机会)

     

(fbc.ebc):C ++ EH异常 - 代码e06d7363(第一次机会)

     

(fbc.ebc):C ++ EH异常 - 代码e06d7363(第一次机会)

     

(fbc.ebc):C ++ EH异常 - 代码e06d7363(第一次机会)

     

(fbc.ebc):C ++ EH异常 - 代码e06d7363(第一次机会)

     

(fbc.ebc):CLR异常 - 代码e0434352(第一次机会)

     

(fbc.ebc):C ++ EH异常 - 代码e06d7363(第一次机会)

     

(fbc.ebc):CLR异常 - 代码e0434352(第一次机会)

     

(fbc.ebc):CLR异常 - 代码e0434352(第一次机会)

另外,我在winDBG中运行了这个命令,这进一步让我感到困惑:

  

effmach#   有效机器:x86兼容(x86)

不确定从何处开始,并会感谢任何建议。

0 个答案:

没有答案