C# 版dll 程序集合並工具
最近要開發一個控件給同事用,開發中會引用一些第三方DLL,這樣交給用戶很不方便,希望的效果是直接交付一個DLL文件。網上找了一些資料。
1. 使用 Costura.Fody ,這個強大之處是可以在build階段直接將依賴的DLL合並在目標EXE中,支持非托管DLL進行mixed mode 打包,不足之處是
只能將DLL合並到EXE中,不支持DLL和DLL的合並,目前滿足不了我的需求。
參考資料 http://www.cnblogs.com/instance/archive/2015/10/09/4863811.html
Costura.Fody github地址:https://github.com/Fody/Costura
Costura.Fody 是使用場景:最終發布只有一個EXE,將依賴的DLL合並到一個EXE中。
2. 微軟的ILMerge工具。
下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=17630
這個支持將EXE依賴的DLL合並到EXE中,也支持將主DLL依賴的其他DLL合並到一個DLL中,這個基本滿足要求,唯一不足之處是沒有GUI,每次使用敲命令很不方便,於是繼續尋找,有ILMergeGUI 。
3. ILMergeGUI
地址:http://ilmergegui.codeplex.com/
這個代碼下載下來編譯都不通過,也不好用,看來還是自己動手豐衣足食。
4. 自己開發ILMergeGUI
微軟的ILMerge需要安裝才能使用,結合Costura.Fody可以將ILMerge合並到自己開發的工具中,並且無需安裝ILMerge.
說明:
1. 當主文件為dll時,合並導出的文件為 DLL,當主文件類型為exe 時,合並后的文件為exe;
2. . 列表里面的dll文件為主文件的依賴文件;
3. CLR版本支持v1、v1.1、 v2、v4,注意要與主文件及相關文件CLR版本一致;
勾選日志輸出,會在工具目錄生成日志文件。
ILMerge關鍵API:
public void SetInputAssemblies(string[] assems);
設置輸入的程序集,每一項為程序集包含文件絕對路徑的全名,其中參數第一個程序集為主程序集。必須在調用Merge()之前設置。
public string OutputFile { get; set; }
獲取或設置合並后生成的文件名,必須在調用Merge()之前設置。
public void SetTargetPlatform(string platform, string dir);
設置.net framework目標平台,platform參數支持的:"v1", "v1.1", "v2", "v4",第二個參數為mscorlib.dll目錄
public ILMerge.Kind TargetKind { get; set; }
獲取或設置目標平台類型(Windows應用程序、DOS應用程序、DLL)
public enum Kind
{
Dll = 0,
Exe = 1,
WinExe = 2,
SameAsPrimaryAssembly = 3,
}
此工具設置為SameAsPrimaryAssembly,即與輸入文件的主程序集相同。
public void Merge();
開始合並。
工具下載:http://files.cnblogs.com/files/sndnnlfhvk/ILMergeGUI.zip
源碼下載:http://files.cnblogs.com/files/sndnnlfhvk/ILMergeGUICode.zip