电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

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


发布日期:2023/10/4
 

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

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

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

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

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

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

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

无法加载dll找不到指定的模块

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

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

()在C盘下找到了下列文件msvcmddllmsvcpddllmsvcrddllMicrosoftVCDebugCRTmanifest把这几个文件拷贝到目标机器上放到运行目录下或放到system就可以了

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

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

上一篇:检测用户名是否存在

下一篇:判断字符串中相同字符的个数