[Visual Studio] ILMerge 自動合併多個DLL

當軟體的規模到達一個程度時,一個方案下就會依功能將程式分到多個專案,進而導致在發布程式時就要注意是不是少部屬一個DLL,導致程式執行失敗,因此 ILMerge 就是解決這類問題的其中一個方法。ILMerge可以將多個DLL合併成一個DLL,也能讓DLL和EXE檔合併成只有單一EXE檔。

程式架構介紹

  • Kernel - 核心程式,想隱藏至ServierPortal
  • ServicePortal - 其他程式使用會參照的DLL,會提供許多方法讓其他程式使用,方法會使用到Kernel的方法
  • ServicePlatformDemo - 外部程式

使用前結果

使用 ILMerge前至少需要兩個DLL才能正確執行EXE檔,但我想要Kernel.dll 和 ServicePortal.dll整合成一個DLL

ILMerge基本步驟

ILMerge在Visual Studio上使用非常簡單,很多複雜的設定及步驟已經有高手將其簡單化,所以接著我是用最簡單的方式來執行ILMerge

step 1. 在要最後保留的專案下打開nuget,以我之前舉的例子為例,因為我要保留ServicePortal.dll,所以我就要打開ServicePortal這個專案的nuget

step 2. 安裝「MSBuild.ILMerge.Task」。安裝成功後,該專案下就會多「ILMerge.props」及「ILMergeOrder.txt」兩個檔案

step 3. 重新編譯程式,你會在「輸出」視窗看到 Merge的訊息就代表成功了,DLL就只剩下一個了

使用分析

這種方式是比較懶人的做法,主要優點是當程式碼有變動時,編譯時就會自動合併成新的組件,不用手動合併。但這種做法的參數設定就會被限制住,舉例來說原本的ILMerge可以透過command的參數來決定外部程式能不能看到被合併DLL的公開方法,但MSBuild.ILMerge.Task設定就是不能看到,所以其彈性就是比較低。

參考資料

黑暗執行緒 - Visual Studio編譯小技巧:工具程式一檔搞定

保哥 - 介紹好用工具:ILMerge (將多的 .NET 組件合併成單一組件)