1

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

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

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

谢谢!

4

2 回答 2

0

一般来说,它不会起作用。这是因为第三方 DLL 版本在加载到内存时可能会相互干扰。一个例子可能是如果有一个独占资源,例如特定目录中的文件。或特定设备。问题是,没有人知道甚至可能连第 3 方 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. 您的客户必须链接到您的手动导入库。
于 2012-05-25T13:15:08.620 回答
0

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

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

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

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

#pragma comment(linker, "/export:function=otherdll.function")
于 2012-05-25T12:57:46.647 回答