題:
在單個程序集中捆綁.NET程序集的軟件
allquixotic
2014-02-05 04:16:42 UTC
view on stackexchange narkive permalink

說我有一個依賴於各種第三方.NET DLL的.NET / CLR程序 Hello.exe (或DLL Hello.dll )。我想只提供一個文件,而沒有提供實際的“安裝程序”,所以我正在尋找可以將所有依賴項打包到可執行文件中的軟件,然後在我的任何代碼開始運行之前加載它們。

我還需要它無條件地加載提供的每個DLL,而不僅僅是“按需”加載,因為DLL中的某些類型是通過反射訪問的,因此類加載器將永遠不會嘗試顯式加載DLL和因此調用類加載器鉤子。如果不需要我自己的任何代碼就可以將代碼添加到可執行文件中。

我正在使用SharpDevelop和.NET Framework 4.0 Full Profile,但理想的解決方案是此問題將與IDE無關,並且可以與.NET 3.0或更高版本一起使用(2.0可能更好,但是請不要貪婪...)

您可以將程序集打包到一個文件中,然後在應用程序加載時將它們放入一個臨時目錄以進行可能的加載,然後使用“ Assembly.LoadFrom”來完成實際工作?
這些第三方DLL是託管的還是本地的?您是否還需要打包.NET框架,即在不安裝.NET的情況下運行您的應用?
不,我不需要安裝.NET Framework即可運行該應用程序。第三方DLL大多是純.NET程序集,但有些是本機的。
三 答案:
#1
+8
BatteryBackupUnit
2014-06-19 11:19:05 UTC
view on stackexchange narkive permalink

ILMerge怎麼樣?它已經存在了很長時間,並且資源很多。例如,這是一個快速介紹。此外,stackoverflow問題已經涵蓋了一些常見的陷阱,例如與EXE合併DLL

它也獨立於您的構建環境。您只需要將其嵌入到構建過程中即可。

ILMerge並不完美。例如,它不支持WPF程序集的合併,或者將庫作為資源嵌入並動態加載它們。例如,請參見此博客帖子

對於LibZ容器,還有另一種替代方法,一種已經嘗試過的方法,我會認真考慮: Fody.Costura

Mono mkbundle可能是另一種選擇,但是請注意,它會生成本機代碼。依賴關係可以靜態鏈接。在Windows上,還需要cygwin才能運行(另請參見此論壇線程

#2
+5
allquixotic
2014-02-05 04:55:11 UTC
view on stackexchange narkive permalink

LibZ容器使用代碼從源文件中解壓縮壓縮的程序集資源,並從內存中加載它們,從而對您的主程序集進行檢測。它聲稱可以與反射代碼以及強名稱一起使用,並且不會以任何方式修改原始程序集文件,因此強名稱引用將可以正常工作。

您能否詳細說明一下此工具?在您的建議中增加一些個人經驗?易於配置/使用嗎?也許添加一個例子?
#3
  0
allquixotic
2014-02-05 04:53:41 UTC
view on stackexchange narkive permalink

il-repack部分滿足答案的條件,但是不幸的是,它重新打包了程序集,從而破壞了它們的強名稱,因此,如果您依賴以強名稱簽名的程序集,這將獲得成功。不行直到程序集被類加載之後,它也不適用於大多數反射代碼。

您能否詳細說明一下此工具?在您的建議中增加一些個人經驗?易於配置/使用嗎?也許添加一個例子?


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...