ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-10 12:06:01  阅读:313  来源: 互联网

标签:c-cli mixed-mode c-3 c


我有一个由旧版应用程序动态加载的本机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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有