SidBySide:第三方Dll指的是两个版本的MSVCR80.DLL

时间:2009-10-13 10:52:49

标签: c++ windows dll visual-studio-2005 side-by-side

我们包含第三方lib + DLL,最近在安装时遇到很多麻烦。使用dependencywalker,我们发现dll本身引用了两个不同版本的

MSVCR80.DLL:
Version 8.0.50727.4053 and
Version 8.0.50727.42

alt text http://img101.imageshack.us/img101/1734/dependencywalk2.jpg

在大多数情况下,即使我们不分发两个版本,安装也不会产生任何问题。但在许多情况下,我们的安装并没有开始。然后,我们从SideBySide管理器中查找Windows系统事件日志中的消息:“DLL的版本不匹配”。在大多数情况下,通过安装.NET框架可以解决此问题(尽管我们不使用它)。但现在我们有一个案例,这无济于事。

我知道解决方案是将两个版本安装为共享程序集,但这似乎并不容易,除此之外我更喜欢一个更简单的解决方案。有人知道解决方法吗?

我能以某种方式只使用一个版本的Dll吗?

修改 我现在尝试过克里斯蒂安人的建议:

D:\Develop\LEADTOOLS15\patch_maifest>mt.exe -inputresource:ltkrn15u.dll;#1 -out:old.manifest
Microsoft (R) Manifest Tool version 5.2.3790.2075
Copyright (c) Microsoft Corporation 2005.
All rights reserved.

mt.exe : general error c101008c: Failed to read the manifest from the resource of file "ltkrn15u.dll". Ressource not found.

如果我使用完整路径查看dll依赖项,我会看到以下内容: alt text http://img340.imageshack.us/img340/4122/dependencywalk3.jpg

较低的MSVCR80.DLL是版本... 42。我不明白这一点。为什么MSVC P 80.DLL指的是不同版本的MSVC R 80.DLL。这可能是一个依赖行者的问题吗?

2 个答案:

答案 0 :(得分:1)

您必须从dll更改/更新清单资源。

mt.exe -inputresource:dll_with_manifest.dll;#1 -out:old.manifest
mt.exe -manifest new.manifest -outputresource:dll_with_manfiest.dll;#1

有时RT_MANIFEST(类型24)资源类型在资源表中没有#1索引,您应该使用资源查看器(ResourceHackerResEdit)并找出索引号。我已经看到清单具有#2索引号的情况。

答案 1 :(得分:1)

您最好的选择是在应用程序安装程序包中提供所需的DLL。至少使用第三方DLL所依赖的版本。

Microsoft为其运行时DLL(vcredits_ *)提供独立安装程序。可以下载Visual Studio 2005的最新版本here。这也是您的DLL链接的版本。您可以从安装程序中静默启动可再发行软件包。

作为已安装系统的手动解决方法,只需在目标计算机上应用redist安装程序。

如果选择此方法,则无需担心版本冲突,因为依赖于旧版本的应用程序将被重定向为始终使用最新版本。

为了更好地理解,您可以查看此MSDN articles