解决在调用第三方dll时因为runtime library不一致导致调用失败的方法

情境重现: 我在自己写的一个dll中调用第三方dll。

调用方式:显式调用。

第三方dll是否完整: 不完整。 如何判断不完整: 使用dependency walker 打开第三方dll时出现提示:

打开dependency walker 下方的log window 获得如下图所示结果:

对于dll中的warning 我们可以不关注,但是若出现error 则会严重影响到该dll在其他环境中的使用。

有关error信息 side-by-side configuration contains errors 参看我的日志http://blog.csdn.net/xxxwrq/article/details/8738024 (该日志是基础,我们需要懂一些东西)。

接下来我们就去分析该dll.

使用vs2005打开该dll 。

打开RT_MANIFEST目录下的2 得到以下视图:

可以看到有两个依赖程序集(dependency assembly)  分别是 microsoft.vc80.crt 和 microsoft.vc80.mfc 其版本均为 8.0.50727.6195.  

因而我们去找到这两个文件。 

最终我们在以下路径C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT  ,

                                  C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC

分别找到了我们所需要的东西:

在side-by-side configuration error文章中我曾提到在manifest文件中会有一些提示之类的东东。

然后我们打开了该Microsoft.VC80.CRT.manifest 和 Microsoft.VC80.MFC.manifest文件 发现如下内容:

可以看到 Microsoft.VC80.CRT的版本号是 8.0.50608.0 与上文中提到的dll需要的版本号不一致。这个后果非常严重,直接导致dependency walker打开该dll时出现错误,以及在实际调用它时出现错误。  那我们的解决方法

    想办法升级该dll,或者ATL 使他们版本一致。 升级ATL的梦想变得奢侈。因而没萌实现,求实现。

  在尝试使用redist_x86.exe解决这个问题时依然没有解决。

在经历无数次失败后,   提出如下解决方案最终将问题解决:

     

1 将如下两文件夹下的所有文件打包复制到程序的执行目录下:

          C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT  ,

          C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC

2 将该两个manifest中的version修改为第三方dll中依赖项的version号。

然后,问题终于解决了!!

  最终发现上述两个文件夹下的好多东西没有用,但是唯独不能缺少的东西是两个manifest以及一些dll。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值