2013-06-04 34 views
1

創建新庫時,我引用了許多其他(非標準)庫,如RestSharp.dll,Newtonsoft.dll,MyUtilities.dll等。我的庫在我的開發環境中正常工作,因爲我已經下載了所有這些其他庫,它們都位於我的項目的bin文件夾中,但只要我嘗試發佈該庫並在新位置使用它,就會失敗,因爲找不到所引用的庫。如何將參考庫打包到新的庫文件中

如何設置我的MyAPI.csproj項目,以便將這些dll /庫打包到已發佈的.dll文件中,未來的MyAPI.dll用戶不必擔心下載和引用這些依賴關係?

以爲這是簡單的,但我的谷歌福今天較弱。將這些外部引用設置爲CopyLocal = False會將它們從/bin/目錄中刪除,從而導致它們被打包到MyAPU.dll中,但實際上Visual Studio只是將它們添加到我的全局程序集緩存(GAC)中,這對於未來的用戶的API。

+2

我不知道是否有潛在的侵權,但你可以只分發這些庫與DLL。 –

+0

好吧,我只是想打包我自己的庫。爲了模塊化,我有許多不同的csproj與我在自己的應用程序中回收的各種實用程序。它沒有辦法將它們全部鏈接在一起,作爲一個生產庫的資源,而不是將所有源代碼文件複製到一個通用項目中? – Alain

+0

如果是這種情況,所有代碼都是我的,我可能有一個項目將所有文件都鏈接到它。儘管如此,這仍然可能讓人覺得很麻煩,我希望有一個更簡單的答案。 –

回答

4

有兩個選項(據我所知):

  1. ILMerge
  2. 嵌入式資源和Assembly.Resolve(見Jeffrey Richter

首先,你可以使用ILMerge,這是comamndline程序,可以將多個.NET程序集合在一起,創建一個輸出文件。它不能合併WPF項目。可以添加到postbuild事件以使自動合併。

二是增加庫作爲嵌入式資源到您的項目,然後當它從資源需要註冊到Assembly.Resolve event和裝載組件。來自Jeffrey Richter的關於此方法的文章:Jeffrey Richter

第二種方法具有主要的缺點,它不與合併多個文庫成一個(它只能用於添加庫可執行文件),至少在c#而不另一個工具工作。要將庫添加到庫中,您必須使用另一個工具,該工具在第二頁的Jeffrey文章註釋中提到:(Module initializer injection)。將庫嵌入到其他庫中的問題是您無法(至少在c#中)註冊到Assembly.Resolve事件需要嵌入庫之前,因此您需要使用Module initializer injection將註冊注入模塊初始值設定項。它也可以被設置爲構建事件,這是用工具在apge上寫的。這聽起來可能很複雜,但一旦你把它設置得很簡單。

+0

我認爲這是一個常見的事情要做。不知道我不得不訴諸第三方工具或奇怪的技術。感謝這一點,雖然。 – Alain

+0

作爲對你的問題的回答(我沒有權利評論你的回答),我相信你不能,你必須使用ILMerge或Assembly.Resolve。或者你可以只分發你的應用程序/庫,但你需要分發多個文件。 – Krtek

+0

奇怪的是,每個人對setup.exe的記憶快速衰落。 –

0

這不是免費的(當然還有一個試用版),但是我的一位朋友告訴我一個名爲.NET Reactor的程序,它能夠將一個exe文件打包成一個可執行文件,非常值得一看。

我會說下一個最直接的替代方法是ClickOnce的,a good tutorial is here

+0

不構建可執行文件或WPF應用程序,所以這些不適用。 – Alain

+0

當然.net反應堆仍然適用? – JMK

+0

那麼這個doc文件(http://www.eziriz.com/help/merge.html)似乎有很多我正在尋找的關鍵字,但它似乎都需要建立一個可執行文件。此外,程序的主要目的(混淆)違背了我的目的,即創建任何人都可以使用的公共API .dll。混淆處理會將它從.NET程序集轉換爲本地程序,從而限制了它的可用性。 – Alain

3

有一個免費的NuGet包「Costura.Fody」它包依賴組件作爲資源到您的裝配。該解決方案適用於WPF和其他託管程序集。

如果相關組件是不是在執行文件夾,打包組件automaitcally拍攝。它還會自動配置您的msbuild目標以在構建期間打包依賴項。您不必在程序集中添加代碼。 它還允許您配置哪些程序集打包或不打包到xml文件中。

它使用兩個methos的組合:使用嵌入資源作爲合併組件的方法的

  • 傑弗裏裏希特的建議。
  • Einar Egilsson建議使用cecil創建模塊初始值設定項。

您可以找到的文檔在這裏:https://github.com/Fody/Costura/blob/master/README.md