我有一个由遗留应用程序动态加载的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()
...
答案 0 :(得分:2)
我遇到了这个问题。我提供了有关此question的一些其他信息和解决方法。但我很高兴总结并在此提供答案。
您遇到的基本问题是,在将本机应用程序链接到混合模式dll和非托管dll时,链接器的工作方式似乎存在错误或变化。看来只有在混合模式dll和非托管dll由非托管可执行文件链接时才会发生这种情况。
我最终使用选项3来解决这个问题,因为它似乎是最安全的。只需转到Project Properties对话框,选择Linker-> Input选项卡。在Additional Dependencies字段中指定混合模式dll的lib文件。确保混合模式lib是该字段中列出的第一个库。
设置Additional Dependencies字段如下: mixedmode.lib; unmanaged.lib; unmanaged2.lib
这似乎解决了非托管应用程序崩溃的问题。如果重新排列lib的顺序,那么unmanaged.lib首先会在崩溃时返回。
我希望这有帮助!
答案 1 :(得分:1)
我觉得符号设置不正确。您可能希望先执行以下操作:
步骤7和8应该为您提供一个更有意义的堆栈来使用
进行调试