簡體   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