DLL依赖版本冲突

时间:2012-05-24 07:48:11

标签: c++ windows dll dependencies

我在Visual Studio 2008 Express中使用C ++。

我们正在向客户端提供仅二进制Windows库,该客户端本身使用许多其他库。因此,我们发送了我们的dll文件以及我们使用的dll文件。现在问题是我们的客户端使用了我们也使用的一些库,但是在另一个版本中。因此他不能使用我们的库,因为我们都依赖的库是不兼容的。

从技术上讲,我认为应该可以将两个依赖版本加载到进程空间中。但是,我不确定如何执行此操作,因为它们的应用程序以及我们的dll都会查找相同的依赖项dll文件名。谁能告诉我解决这个问题最好/最干净的方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

你可以使用你将提供的(新的)附加DLL解决这类问题,并且会处理版本冲突(在运行时) - 作为应用程序及其依赖项之间的一种代理。

另一种方法是使用Windows Forwarded Libraries mechanism

  

转发器是一种方便的方式来容纳从一个DLL移动到另一个DLL的功能

您可以使用多种方式声明转发器,例如模块定义(.def)文件和#pragma

#pragma comment(linker, "/export:function=otherdll.function")

答案 1 :(得分:0)

一般来说,它不起作用。这是因为第三方DLL版本在加载到内存时可能会相互干扰。一个例子可能是,如果存在专用资源,例如,特定目录中的文件。或特定设备。问题是,没有人知道甚至可能不是第三方DLL的制造商 - 因此需要进行大量的测试。

但也许你很幸运,无论如何它都有效。我的食谱:

  1. 将您的DLL“DTAG.DLL”和所有需要的DLL放在应用程序目录的子目录中,并使用固定名称,例如: “DTAG_LIB”。
  2. 手动编写导入库(使用DELAYLOAD还有其他可能性)。在该库中使用LoadLibraryEx加载DLL。提供以“DTAG_LIB \ DTAG.DLL”结尾的绝对路径和标志LOAD_WITH_ALTERED_SEARCH_PATH。然后,Windows将从此目录加载DTAG.DLL,并从该目录加载所有需要的DLL。不要将PATH设置为“DTAG_LIB”!
  3. 您的客户必须链接到您的手动导入库。