DLL 依赖项版本冲突

Dll dependency version conflict

本文关键字:冲突 版本 依赖 DLL      更新时间:2023-10-16

我正在将C++与Visual Studio 2008 Express一起使用。

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

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

谢谢!

一般来说,它不起作用。这是因为第三方 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. 您的客户必须链接到您的手动导入库。

您可以使用将交付的(新的)附加 DLL 来解决此类问题,该 DLL 将负责处理版本冲突(在运行时) - 作为您的应用程序与其依赖项之间的一种代理。

另一种方法是使用 Windows 转发库机制。

转发器是适应从一个 DLL 移动到另一个 DLL 的功能的便捷方法

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

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