繁体   English   中英

DLL依赖版本冲突

[英]Dll dependency version conflict

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

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

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

谢谢!

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

一种替代方法是使用Windows 转发的库机制

转发器是容纳从一个DLL到另一个DLL的功能的便捷方法

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

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

一般来说,它不会起作用。 这是由于以下事实:第三方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. 您的客户必须链接到您的手动导入库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM