2010-10-29 50 views
4

我們有一個應用程序依賴於許多第三方DLL組。不幸的是,這些第三方DLL的編寫者都沒有對它們進行非常一致的命名,所以很難看出哪個DLL是什麼組的一部分。如何將第三方Windows DLL組織到我的應用程序文件夾中的子文件夾中?

爲了嘗試和管理這個,我們希望將第三方DLL組放在應用程序文件夾的一個文件夾中,而不是像這樣在應用程序旁邊。

--> Application Folder 
    --> Application.exe 
    --> MyDLL1.dll 
    --> MyDLL2.dll 
    --> Third Party 1 DLL folder 
     --> Third Party 1 DLL 1.dll 
     --> Third Party 1 DLL 2.dll 
     --> Third Party 1 DLL 3.dll 
    --> Third Party 2 DLL folder 
     --> Third Party 2 DLL 1.dll 
     --> Third Party 2 DLL 2.dll 
     --> Third Party 2 DLL 3.dll 

我的問題是如何讓動態鏈接器找到它們並加載它們?

我們可以使用LoadLibrary()和GetProcAddress()手動執行此操作,但這非常繁瑣。看起來我們可以用清單和「探索」來做到這一點,但是這似乎只是Windows 7(我們需要在XP及更高版本上工作)。

更新

我們用來體現這樣做到底(感謝@克里斯) - 有一對夫婦,我們必須在任何情況下,通過跳是尋找一個解決方案的其他箍!

首先,我們的「程序集」實際上有幾個DLL,我們鏈接到一個鏈接,然後鏈接到其他鏈接。所有這些DLL都需要將程序集依賴項添加到它們的清單中(可以使用mt.exe來執行此操作,而無需訪問這些DLL的源代碼)。

其次,程序集需要與DLL並行,而不是與EXE一起 - 我們的DLL實際上是一個已經在應用程序子文件夾中的插件。

這裏是我們的最終佈局:

--> Application Folder 
    --> Application.exe 
    --> Plugins folder 
     --> MyDLL1.dll 
     --> Third Party 1 
      --> Third Party 1.manifest 
      --> A.dll 
      --> B.dll 
      --> C.dll 

如果MyDLL1.dll是一個插件,鏈接到A.DLL,並A.DLL鏈接到兩個B.DLL和C.dll,則:

  1. 「第三方1.manifest」需要包括所有A.DLL,B.DLL和C.dll作爲一個組件
  2. 「MyDLL1.dll」需要在其清單中的「第三方1」或依賴項動態鏈接程序不會找到A.dll
  3. A.dll需要其清單中的依賴項條目爲「第三方1」或動態鏈接程序不會找到B.dll和C.dll
  4. 「第三方1」文件夾需要與「MyDLL1.dll 「,不是旁邊的」Application.exe「

對我而言,(3)有點刺激。你會認爲鏈接器會在程序集中尋找依賴的DLL。

回答

6

您可以使用清單而不探測。 通過定義包含dll的.manifests創建「假」程序集。 (在這個dll中沒有修改) 由於程序集支持被添加到NT 5.1(Windows XP),Windows加載程序首先通過掃描帶有程序集名稱的文件夾來查找程序集。

因此,舉例來說,如果你需要與你的應用程序分發爲Visual C 2008的Microsoft Visual C運行時,你可以創建一個文件夾結構,看起來像這樣:

--> Application Folder 
    --> Application.exe 
    --> MyDll1.dll 
    --> MyDll2.dll 
    --> Microsoft.VC90.CRT 
    --> Microsoft.VC90.CRT.manifest 
    --> msvcr90.dll 
    --> msvcp90.dll 
    --> msvcm90.dll 

此相同的方案會工作爲您的第三方DLL。所有你需要做的就是將「假」程序集作爲依賴程序集添加到應用程序的清單中(如果你的dll有清單,(並且它們訪問第三方dll),那麼它們的清單也必須有條目。

描述組件清單文件需要一個assemblyIdentity,和每個DLL文件節點:

<assembly manifestVersion="1.0"> 
    <assemblyIdentity type="Win32" name="Assembly Name" version="1.0.0.0" processorArchitecture="x86" /> 
    <file name="dll1.dll" /> 
    <file name="dll2.dll" /> 
</assembly> 

你的應用程序和DLL是與微軟的Visual Studio 2005或以後建成,以下指示指令將使您的應用程序查找程序集中的dll:

#pragma comment(linker, "/manifestDependency:\"name='Assembly Name' processorArchitecture='*' version='1.0.0.0' type='win32' \"") 
+0

我們最終使用了這個答案 - 還有一些其他的箍環我們不得不跳過,以防有人在尋找解決方案! – Bids 2010-11-12 11:49:33

+1

編號有興趣知道什麼是過度的籃球?我試圖涵蓋所有相關的基地:) – 2010-11-12 17:43:33

相關問題