Native C Dll调用C ++ / CLI混合模式Dll - 未处理的异常

时间:2009-11-06 06:20:35

标签: c# c c++-cli mixed-mode

我有一个由遗留应用程序动态加载的Native C Dll。此dll的目的是允许基于某些应用程序事件覆盖应用程序行为。我有一个C#dll,它包含我从Native C dll通过混合模式C ++ / CLI dll调用的函数来增强这些应用程序事件。使用此体系结构的应用程序在Windows 2000上完美运行。

该应用程序也可以在Windows XP上运行,但遗憾的是,一旦在应用程序启动时加载了Native C dll,应用程序就会崩溃(Unhandled Exception)。它似乎在尝试加载混合模式dll时崩溃。我已从Native C dll中删除了对混合模式dll的所有依赖项,并且应用程序启动正常。但是一旦添加依赖项,就会发生崩溃。 Windows 2000上的代码与Windows XP上的代码相同。我无权访问应用程序代码,但可以访问Native C dll代码,但无法使调试器停止,因为在初始化完成之前发生崩溃。我怀疑这与CLR初始化和OS加载程序差异有关,但我不确定。我正在寻找有关如何解决这个问题的建议。我正在使用VS2005使用2.0 Framework。我感谢您给予的任何帮助。

异常和堆栈跟踪不是真正有用的:

MyApplication.exe中0x775125f6处的未处理异常:0xC0000005:访问冲突读取位置0x775125f6。

775125f6()  
user32.dll!7e418734()   
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]    
user32.dll!7e418816()   
user32.dll!7e428ea0()   
user32.dll!7e42ce7c()   
ntdll.dll!7c90e473()    
user32.dll!7e42e389()   

...

2 个答案:

答案 0 :(得分:2)

我遇到了这个问题。我提供了有关此question的一些其他信息和解决方法。但我很高兴总结并在此提供答案。

您遇到的基本问题是,在将本机应用程序链接到混合模式dll和非托管dll时,链接器的工作方式似乎存在错误或变化。看来只有在混合模式dll和非托管dll由非托管可执行文件链接时才会发生这种情况。

  • 选项1:将混合模式dll设置为Delay Loaded。
  • 选项2:通过让CLR识别至少一个文件,使非托管exe文件成为混合模式可执行文件。该文件可以为空,只需要存在就可以在可执行文件中正确链接。
  • 选项3:更新非托管可执行文件,以便在链接任何非托管库之前链接混合模式库。

我最终使用选项3来解决这个问题,因为它似乎是最安全的。只需转到Project Properties对话框,选择Linker-> Input选项卡。在Additional Dependencies字段中指定混合模式dll的lib文件。确保混合模式lib是该字段中列出的第一个库。

设置Additional Dependencies字段如下:  mixedmode.lib; unmanaged.lib; unmanaged2.lib

这似乎解决了非托管应用程序崩溃的问题。如果重新排列lib的顺序,那么unmanaged.lib首先会在崩溃时返回。

我希望这有帮助!

答案 1 :(得分:1)

我觉得符号设置不正确。您可能希望先执行以下操作:

  1. 安装Windows调试工具 http://www.microsoft.com/whdc/devtools/debugging/default.mspx
  2. 打开命令提示符,切换到该文件夹​​,运行WinDBG -I
  3. 运行你的程序,让它崩溃,WinDBG将被触发
  4. type .symfix
  5. type .sympath +
  6. 输入.loadby sos clr
  7. type!CLRStack -a
  8. type kb
  9. 步骤7和8应该为您提供一个更有意义的堆栈来使用

    进行调试