2010-05-01 96 views
2

背景
我正在維護應用程序的插件。我正在使用Visual C++ 2003.在同一進程中加載​​一組DLL的多個副本

該插件由幾個DLL組成 - 有主DLL,應用程序使用LoadLibrary加載的DLL,並且有幾個實用程序DLL由主DLL使用,並由彼此。
依賴一般是這樣的:

  • plugin.dll - > utilA.dll,utilB.dll
  • utilA.dll - > utilB.dll
  • utilB.dll - > utilA.dll,utilC .dll

你得到的圖片。

DLL之間的一些依賴關係是加載時間和一些運行時間。

所有的DLL文件都存儲在可執行文件的目錄中(不是必需的,現在它是如何工作的)。

問題
有一個新的要求 - 在運行應用程序中的插件的多個實例。
應用程序在其自己的線程中運行插件的每個實例,即每個線程調用由plugin.dll導出的函數。然而,插件的代碼不過是線程安全的 - 大量的全局變量等。

不幸的是,修復整個事情目前不是一個選項,所以我需要一種方法來加載多個(最多3個)插件的DLL在同一進程中的副本。

備選方案1:不同的名稱接近
創建每個DLL文件3份,使每一個文件都有一個獨特的名字。例如plugin1.dll,plugin2.dll,plugin3.dll,utilA1.dll,utilA2.dll,utilA3.dll,utilB1.dll等。該應用程序將加載plugin1.dll,plugin2.dll和plugin3.dll。這些文件將位於可執行文件的目錄中。

對於每個DLL組通過名稱相互瞭解(所以相互依賴性工作),名稱需要在編譯時知道 - 這意味着DLL需要被多次編譯,每次只有不同的輸出文件名稱。

不是很複雜,但我討厭擁有3個VS項目文件,並且不喜歡反覆編譯相同的文件。

選擇2:並排側組件接近
創建DLL文件的3份,每個組中的其自己的目錄,並且通過將一個組件清單文件在目錄中定義每個組作爲組件,列出插件的DLL。
每個DLL都有一個指向程序集的應用程序清單,以便加載程序找到駐留在同一目錄中的實用程序DLL的副本。清單需要被嵌入,以便在使用LoadLibrary加載DLL時找到它。因爲VS2003沒有內置清單嵌入支持,所以我將使用來自VS以後版本的mt.exe。

我試着部分成功這種做法 - 依賴性期間的DLL加載時發現的,而不是在一個DLL函數被調用加載另一個DLL。
這似乎是預期的行爲,根據this article - 一個DLL的激活上下文只用來在DLL的加載時間,事後也已停用,且進程的激活上下文中使用。

編輯:如預期的那樣與ISOLATION_AWARE_ENABLED一起工作 - DLL的運行時加載使用加載DLL的原始激活上下文。

問題
還有其他的選擇嗎?任何快速的&骯髒的解決方案將做。 :-)

請問ISOLATION_AWARE_ENABLED甚至可以和VS2003一起工作嗎? 編輯:它的確如此。

評論將不勝感激。

謝謝!

回答

0

ISOLATION_AWARE_ENABLED是由Windows SDK頭文件來實現,因此可能不會值得VS2003的。但是,可以下載最新的Windows 7 SDK並將其用於VS2003。

您不需要使用MT鏈接清單。清單可以作爲資源嵌入到沒有明確知識的環境中。

將以下內容添加到dll的.rc文件中以嵌入清單。 (由於近來足夠的平臺SDK RT_MANIFEST應該已經被定義):

#define RT_MANIFEST 24 
#define APP_MANIFEST 1 
#define DLL_MANIFEST 2 

DLL_MANIFEST RT_MANIFEST dllName.dll.embed.manifest 
+0

實際上ISOLATION_AWARE_ENABLED確實與VS2003的工作,我想,隨它是最近足以包括winsxs文件支持SDK。 我不知道使用.rc文件嵌入清單 - 感謝信息。 – george 2010-05-03 19:58:20

相關問題