2009-10-13 73 views
2

我们包含一个第三方lib + DLL,最近在安装时引发了很多麻烦。使用dependencywalker,我们发现,DLL本身是指SidBySide:第三方DLL指的是两个版本的MSVCR80.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吗?

编辑: 我现在试着cristians建议:

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除了它之外。这可能是依赖行者的问题吗?

+0

我真的联系第三方lib制造商,并要求他们只使用其中的一个版本! – stijn 2009-10-13 12:04:41

回答

1

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

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

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

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

为了更好地理解你看这MSDN articles

+0

我现在安装了Visual Studio 2005的可再发行文件。这确实解决了他的问题。我想知道它是没有用的,只是将程序集目录复制到我们的\ bin目录(包含所有Dll和EXE),就像我们之前尝试的那样。 – 2009-10-13 13:00:16

+0

vcredist是最好的选择。当vcredist软件包安装失败时,我看到过一种情况。不知道为什么它不起作用,我不得不手动解包vcredist.exe文件并将文件复制到我们的可执行文件附近。 – 2009-10-13 13:12:18

+0

但是为什么应对我的可执行文件附近的文件不起作用,而在安装vcredist之后修复了这个问题? – 2009-10-13 13:21:11

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的索引,你应该使用资源浏览器(ResourceHacker,或ResEdit),并找出指数数。当清单有#2索引号时,我已经看到了一些情况。

+0

我试过了 - 该DLL似乎没有清单。请参阅我的文章中的编辑。 – 2009-10-13 12:00:33