背景
我正在維護應用程序的插件。我正在使用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一起工作嗎? 編輯:它的確如此。
評論將不勝感激。
謝謝!
實際上ISOLATION_AWARE_ENABLED確實與VS2003的工作,我想,隨它是最近足以包括winsxs文件支持SDK。 我不知道使用.rc文件嵌入清單 - 感謝信息。 – george 2010-05-03 19:58:20