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

 我来答
户如乐9318
2022-10-18 · TA获得超过6641个赞
知道小有建树答主
回答量:2559
采纳率:100%
帮助的人:137万
展开全部

  C和C++有很多好的类库的沉淀 在 NET中 完全抛弃它们而重头再来是非常不明智的 也是不现实的 所以 我们经常需要通过Pinvoke来使用以前遗留下来的非托管的dll 就 NET中使用非托管的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盘下找到了下列文件 msvcm d dll msvcp d dll msvcr d dll Microsoft VC DebugCRT manifest 把这几个文件拷贝到目标机器上 放到运行目录下或放到system 下 就可以了

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

lishixinzhi/Article/program/net/201311/14300

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式