调用非托管dll常出现的bug及解决办法

简介: C和C++有很多好的类库的沉淀,在.NET中,完全抛弃它们而重头再来是非常不明智的、也是不现实的,所以,我们经常需要通过Pinvoke来使用以前遗留下来的非托管的dll。就.NET中使用非托管的dll经验而言,经常碰到的问题至少有两个,它们都是通过在运行时抛出异常来体现的。

      C和C++有很多好的类库的沉淀,在.NET中,完全抛弃它们而重头再来是非常不明智的、也是不现实的,所以,我们经常需要通过Pinvoke来使用以前遗留下来的非托管的dll。就.NET中使用非托管的dll经验而言,经常碰到的问题至少有两个,它们都是通过在运行时抛出异常来体现的。

1.试图加载格式不正确的程序

      出现这种异常,通常是.NET应用程序的“目标平台”与非托管dll的平台不一样。

      一般,在使用VS开发.NET的应用程序和类库时,默认的目标平台为“Any CPU”,即会在运行时可根据CPU类型自动选择X86或X64,拥有这样的能力是因为.NET编译后的程序集是基于IL的,在运行时,CLR才会将其JIT发射为X86或X64的机器码。

      而C或C++编译生成的dll就是机器码,所以,其平台的决策是在编译时决定的。通过编译选项的设置,我们可以将C/C++项目编译为X86的dll或者X64的dll。

      所以,在调用了非托管dll的.NET项目中,也需要将其目标平台属性设为与非托管的dll的运行平台完全一致。通常遗留下来的非托管dll都是基于x86的,所以,在调用了这类非托管dll的.NET项目中,就将其目标平台属性设为“X86”。

      可根据“项目->属性->生成->目标平台”找到该设置:

     

2.无法加载dll,找不到指定的模块。

      运行调用了非托管的.NET应用程序有时会出现这种异常,可是比较郁闷的是,这种异常并不是在所有的电脑上都会出现,就经验来说,它只是在少部分电脑上出现,而在绝大部分电脑上运行都是正常的。我们在开发语音视频录制组件MFile时,就遇到过这个问题,当时很是头疼。

      如果出现这种情况,很大的可能就是那少部分电脑上没有安装VC++运行时(CRT),或者是CRT安装不正确导致的。好用的解决方案有两种:

(1)在C盘下找到了下列文件:msvcm80d.dll、msvcp80d.dll、msvcr80d.dll、Microsoft.VC80.DebugCRT.manifest。把这几个文件拷贝到目标机器上,放到运行目录下或放到system32下,就可以了。     

       注意,一般这几个文件都有多个版本,位于不同的文件夹下,要观察其文件夹的名称:是x86还是x64的、是debug的还是release的、以及是否要MFC的,这些选择要与非托管dll的信息一致。

(2)如果有非托管dll的源码,那就修改编译选项,重新编译一下:将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要上述几个dll了。

 

 

目录
相关文章
|
7月前
|
人工智能 安全 网络安全
阿里云1分钟部署OpenClaw + 53个官方OpenClaw Skills解析+国内安全适配实战避坑指南
在AI智能体全面普及的2026年,OpenClaw凭借开源灵活的架构成为效率工具首选,但安全风险也随之凸显——2月爆发的ClawHavoc事件中,ClawHub插件市场发现341个恶意技能(占比12%),让用户意识到“技能选择”比“功能堆砌”更重要。官方内置的53个技能经过严格安全校验,成为最可靠的选择,而阿里云的稳定部署环境与Molili本土化工具,则彻底解决了OpenClaw默认适配海外生态、部署复杂的痛点。
1197 1
|
9月前
|
移动开发 weex Android开发
极致体验无小事:Weex购物车基础优化实践
手机淘宝购物车团队在完成Weex技术升级后,聚焦基础体验精细化治理,覆盖暗黑模式适配、热区对齐、皮肤样式优化、适老化改造与多终端兼容。通过舆情、数据与用户视角三轨驱动,实现从功能交付到体验交付的思维升级,打造更流畅、包容、个性化的购物体验。
|
5月前
|
人工智能 JSON 测试技术
手写一个自动断言Skill:30行代码,省你每天2小时
测试正悄然变革:AI加速编码,手工断言却成交付瓶颈。30行代码实现自动断言——基于响应结构智能生成存在性、类型、范围等规则断言,适配微服务与AI生成代码的快速迭代,将断言维护从小时级降至秒级。
|
9月前
|
存储 缓存 NoSQL
全球金融数据实时对接实战:基于WebSocket的印度、马来西亚、韩国股票API集成指南
本文详解基于WebSocket的印度、马来西亚、韩国股票API集成方案,涵盖多时区处理、协议统一、高频数据优化与合规要点,提供企业级低延迟金融数据对接实战指南,助力构建全球化交易系统。(239字)
|
存储 自然语言处理 算法
【算法精讲系列】MGTE系列模型,RAG实施中的重要模型
检索增强生成(RAG)结合检索与生成技术,利用外部知识库提升大模型的回答准确性与丰富性。RAG的关键组件包括文本表示模型和排序模型,前者计算文本向量表示,后者进行精细排序。阿里巴巴通义实验室推出的GTE-Multilingual系列模型,具备高性能、长文档支持、多语言处理及弹性向量表示等特性,显著提升了RAG系统的检索与排序效果。该系列模型已在多个数据集上展示出优越性能,并支持多语言和长文本处理,适用于各种复杂应用场景。
3709 18
|
人工智能 自然语言处理 负载均衡
探索 api.maynor1024.live:一站式 AI 服务平台
探索 api.maynor1024.live:一站式 AI 服务平台
898 1
|
数据库 Python
定义模型
定义模型。
287 1
|
SQL 数据库
数据库(五)
`UPDATE` SQL语句用于修改表中的数据。基本语法是:`UPDATE 表名 SET 属性名1=新值1,属性名2=新值2 WHERE 条件表达式`。例如,更新员工工资:`UPDATE emp SET salary=5000 WHERE id=1`。可以使用`+=`操作符增加值,如`UPDATE emp SET salary=salary+500 WHERE dept_id=2`。统计查询中,`COUNT`, `MAX`, `MIN`, `AVG`, `SUM`等函数用于数值、字符和日期的统计分析,注意`WHERE`子句不能直接使用聚集函数。
388 2
访问结构成员
【2月更文挑战第9天】访问结构成员。
176 3
|
JSON 缓存 C#
提高游戏开发效率之配置表生成工具
提高游戏开发效率之配置表生成工具
2240 1
提高游戏开发效率之配置表生成工具