2010-01-05 65 views
7

我有一個我做過的類庫項目。我們稱之爲ClassA。在ClassA中,我需要訪問位於dll(ToolsDLL.dll)中的一些工具。你可以將dll捆綁在一起嗎?

在ClassA的我已經加入ToolsDLL.dll到項目和選擇的ToolsDLL.dll文件複製到輸出目錄ALWAYS。因此,該庫建立和編譯就好了,在輸出目錄中,我看到ClassA.dll以及ToolsDLL.dll

接下來,我想編寫一個應用程序,說App_A使用ClassA中的方法。所以,在我的App_A項目中,我添加了對ClassA.dll的引用,以便可以訪問它的名稱空間。一切都很好,它建立/編譯。

問題是一旦我運行App_A並且它到達了ToolsDLL.dll需要使用的地方,它就會拋出一個異常「無法加載ToolsDLL.dll。我不明白它有可能如何無法找到該DLL,因爲它與ClassA.dll在同一目錄中。

我發現如果我把ToolsDLL.dll放在App_A的輸出目錄中,它工作得很好。是否有任何解決方法?有什麼辦法可以將ToolsDll.dll以某種方式與ClassA.dll捆綁在一起,原因是我的客戶將編寫他們自己的類似於AppA的應用程序,如果他們只需要在他們的項目中引用一個文件而不是多個。

回答

12

有一個來自微軟的工具叫做ILMerge。它可能會做你想做的,把幾個程序集打包成一個文件。

P.S.:另一種,亦常用於解決您的問題將是一個生成後事件添加到您的應用程序的解決方案/項目複製所需的ToolsDLL.dll到輸出目錄?沿着線的東西:

xcopy /y /d $(SolutionDir)\lib\ToolsDLL.dll $(OutputDir)\ToolsDLL.dll 

(很抱歉,如果我得到它的一些錯誤,我從我的記憶打字)

當然,你的客戶也必須做到這一點。但之後他們可能再次做到這一點。

+0

它看起來像ILMerge只能在.NET程序集使用。那是對的嗎。在我的情況下,ToolsDLL.dll是由芯片製造商提供給我的。我不知道它是不是.net程序集。這是否重要? – PICyourBrain 2010-01-05 16:52:27

+0

是的,我相信它只適用於.NET程序集。 爲了弄清楚你有什麼樣的'.dll',或許你可以使用.dll。NET SDK實用程序'ildasm',嘗試並反彙編'.dll'。如果它是一個.NET程序集,這應該工作;如果它包含本機代碼,則'ildasm'應該失敗。 – stakx 2010-01-05 17:40:18

+0

我注意到在Visual Studio中,如果我去ToolsDll.dll - >屬性有一個屬性稱爲行動。我可以將其設置爲Embedded Resource嗎? – PICyourBrain 2010-01-05 18:01:13

1

你有沒有添加DLL的項目,或者你實際添加到它的參考?你應該做後者,那麼這種事情會自動照顧你。這聽起來像你已經將實際文件添加到項目文件,並將其設置爲複製。

如果一定要一個文件的方法,然後接受他人的ILMerge顯然建議...

0

您可以使用IL合併工具,或在GAC安裝ToolsDLL.dll。

此外,如果你看一下APP_A的輸出,ClassA.dll已經存在,這就是它在尋找ToolsDLL.dll。

相關問題