编程语言
首页 > 编程语言> > C#-本机C Dll调用C/C++LI混合模式Dll-未处理的异常

C#-本机C Dll调用C/C++LI混合模式Dll-未处理的异常

作者:互联网

我有一个由旧版应用程序动态加载的本机C Dll.该dll的目的是允许基于某些应用程序事件来覆盖应用程序行为.我有一个C#dll,其中包含我从本机C dll通过混合模式C/C++LI dll调用以增强这些应用程序事件的函数.使用此体系结构的应用程序在Windows 2000上可以完美运行.

该应用程序还可以在Windows XP上运行,但是不幸的是,一旦在应用程序启动时加载了本机C dll,应用程序就会崩溃(未处理的异常).尝试加载混合模式dll时,它似乎崩溃了.我已经从Native C dll中删除了对混合模式dll的所有依赖关系,并且应用程序正常启动.但是,一旦添加了依赖性,就会发生崩溃. Windows 2000上的代码与Windows XP上的代码相同.我没有访问应用程序代码的权限,但是有访问Native C dll代码的权限,但是由于初始化完成前发生崩溃,无法使调试器停止.我怀疑这与CLR初始化和OS加载程序的差异有关,但不确定.我正在寻找有关如何解决此问题的建议.我正在使用2.0框架的VS2005.感谢您能提供的任何帮助.

异常和堆栈跟踪没有真正的帮助:

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()   

解决方法:

我遇到了这个确切的问题.我提供了有关此question的其他信息和解决方法.但是,我很高兴在此进行总结并提供答案.

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

>选项1:将混合模式dll设置为延迟加载.
>选项2:通过在其中至少包含一个CLR感知文件,使非托管exe成为混合模式可执行文件.该文件可以为空,它只需要存在即可使事物正确链接到可执行文件中.
>选项3:更新非托管可执行文件,以便在链接任何非托管库之前先链接混合模式库.

我最终使用了选项3来解决此问题,因为它似乎最安全.只需转到“项目属性”对话框,选择“链接器”->“输入”选项卡.在“其他依赖项”字段中为混合模式dll指定lib文件.确保混合模式库是该字段中列出的第一个库.

像这样设置“其他依赖项”字段:
 mixedmode.lib; unmanaged.lib; unmanaged2.lib.

这似乎解决了非托管应用程序崩溃的问题.如果您重新排列lib的顺序,那么首先是unmanaged.lib,您将最终崩溃.

我希望这有帮助!

标签:c-cli,mixed-mode,c-3,c
来源: https://codeday.me/bug/20191210/2101616.html