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

Posted

技术标签:

【中文标题】SidBySide:第 3 方 Dll 指的是 MSVCR80.DLL 的两个版本【英文标题】:SidBySide: 3rd Party Dll refers to two versions of MSVCR80.DLL 【发布时间】:2009-10-13 10:52:48 【问题描述】:

我们包含了一个最近在安装中引起很多麻烦的第三方 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 的那个。我不明白这一点。为什么 MSVCP80.DLL 指代的 MSVCR80.DLL 版本与除此之外的版本不同。这可能是dependencywalker的问题吗?

【问题讨论】:

我真的会联系第 3 方库制造商并要求他们只使用其中一个版本! 【参考方案1】:

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

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

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

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

为了更好地理解,请查看MSDN articles。

【讨论】:

我现在安装了 Visual Studio 2005 的可再发行文件。这确实解决了他的问题。我想知道像我们之前尝试的那样将程序集目录复制到我们的 \bin 目录(包含所有 Dll 和 EXE)是没有用的。 vcredist 是最好的选择。我见过一个 vcredist 包安装失败的案例。不知道为什么它不起作用,我不得不手动解压缩 vcredist.exe 文件并将文件复制到我们的可执行文件附近。 但是为什么在我的可执行文件附近处理文件不起作用,而在安装 vcredist 后解决了问题? 就我而言,我只有一个版本的 CRT 作为依赖项。有多个版本会变得复杂。【参考方案2】:

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

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

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

【讨论】:

我试过了 - dll 似乎没有清单。请查看我帖子中的修改。

以上是关于SidBySide:第 3 方 Dll 指的是 MSVCR80.DLL 的两个版本的主要内容,如果未能解决你的问题,请参考以下文章

如何重新加载经常崩溃的第 3 方 DLL

在运行时加载第 3 方 DLL 失败并出现未处理异常(Log4CXX、ActiveMQ)

Visual C++:插件 DLL 使用的第 3 方 DLL 的位置?

DLL 重新加载到它们的首选地址

用 C# 重写 MFC DLL?

Qt/MFC 迁移框架工具:正确退出 DLL?