ILMerge 合并dll和exe文件

ILMerge runs in the v2.0 .NET Runtime, but it is also able to merge v1 or v1.1 assemblies. However it can merge PDB files only for v2 assemblies.

Currently, ILMerge works only on Windows-based platforms. It does not yet support Rotor or Mono.

Download: http://download.microsoft.com/download/1/3/4/1347C99E-9DFB-4252-8F6D-A3129A069F79/ILMerge.msi

 

當 .NET 專案開發越來越多的情況下,通常會有一大堆組件的情況,微軟提供一套 ILMerge 免費工具可以協助你將多個組件合併成單一個 .NET 組件,有效減少部署檔案的數量以及增加部署的彈性。

由於 ILMerge 是指令列工具,在安裝完成之後,所有檔案都放在 C:\Program Files\Microsoft\ILMerge 目錄下,目錄下的 ILMerge.doc 檔案有完整的說明,以下是我閱讀完後的一些摘要筆記:

  • 並非所有組件都能 Merge,例如有些組件包含 unmanaged code 就不一定能 Merge 成功,建議在 Merge 完後利用 PEVerify 工具 (the .NET Framework SDK tool) 驗證輸出的組件是否有效。
  • 執行 ILMerge 時的組件清單(input assemblies)的第一個組件主要組件(primary assembly),如果第一個組件為執行檔(*.exe),則 ILMerge 過的組件就會以此組件中定義的執行入口點(Main method)為主。
  • 如果主要組件(primary assembly)有強式名稱簽章過,而且參數也有指定 snk 檔時,ILMerge 過後會自動重簽(re-signed)。

因为使用了3层架构,运行目录下有很多dll文件,最终发布时,我打算将dll文件都合并到exe文件中去。微软发布的免费软件ILmerge可以完成这项工作。

以下是一些使用範例:

1. 將多個組件合併成一個,其中第一個組件為「主要組件」,通常是執行的主要程式

ILMerge.exe /out:Merged.Output.exe Assembly1.exe Assembly2.dll Assembly3.dll

2. 將多個類別庫組件合併成一個,而且除了主要組件外,任何其他組件都不會公開給其他組件使用

ILMerge.exe /internalize /out:Merged.Output.dll Assembly1.dll Assembly2.dll

3. 在合併完組件後重新利用強式名稱簽名過

ILMerge.exe /keyfile:my.snk /out:Merged.Output.dll Assembly1.dll Assembly2.dll

4. 在組合的時候留下 ILMerge 的紀錄 ( 當 /log 參數不加上 :Output.log 則會將 Log 輸出到 Console )

ILMerge.exe /log:Output.log /out:Merged.Output.dll Assembly1.dll Assembly2.dll

注意:合并为exe时,myapp.exe必须写在file1.dll、file2.dll前面

完 成之后,就得到了一个exe文件,如果想做一些邪恶的事情,可以将一些破解软件的dll合并到你的exe中去。前提是,所有的dll都是托管的,如果尝试 合并C++写的dll,则会失败。有一个工具,叫做mergebin.exe,可以合并托管和非托管dll,用法我还没研究出来,似乎比较困难的样子。这 个工具是ADO.NET 2.0 Data Provider for SQLite的作者写的,他发布的System.Data.SQLite.dll可以被dotNet程序引用,还可以直接被C/C++程序调用,这个 dll就是托管和非托管混合的dll,果然是很牛的!mergebin.exe在其源码包里,有兴趣的朋友可以研究一下。

 

如果不習慣用指令用工具的人也可以考慮使用 ILMerge-GUI 幫你組合組件,操作畫面友善許多,如下圖:

ILMerge-GUI 1.0.0

使用上應該沒多大問題,就不再贅述了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

14 + 9 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据