2

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

MSVCR80.DLL:
Version 8.0.50727.4053 and
Version 8.0.50727.42

替代文字 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 版本与除此之外的版本不同。这可能是dependencywalker的问题吗?

4

2 回答 2

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 索引号的情况。

于 2009-10-13T11:11:52.290 回答
1

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

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

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

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

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

于 2009-10-13T11:46:14.227 回答