情境重现: 我在自己写的一个dll中调用第三方dll。
调用方式:显式调用。
第三方dll是否完整: 不完整。 如何判断不完整: 使用dependency walker 打开第三方dll时出现提示:
打开dependency walker 下方的log window 获得如下图所示结果:
对于dll中的warning 我们可以不关注,但是若出现error 则会严重影响到该dll在其他环境中的使用。
有关error信息 side-by-side configuration contains errors 参看我的日志http://blog.youkuaiyun.com/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。