當發布的程序有引用其它dll, 又只想發布一個exe時就需要把dll打包到exe
當然有多種方法可以打包, 比如微軟的ILMerge,混淆器附帶的打包...
用代碼打包的實現方式也有很好,本文只是其中一種實現方式,不需要釋放文件!
方法如下:
1.項目下新建文件夾Resources
2.把要打包的dll文件放在Resources文件夾下,並包括在項目中
3.右鍵文件屬性, 生成操作選擇嵌入的資源
4.實現如下代碼, 在窗口構造中實現也可以(在窗體事件中無效,如winform_load)
using System; using System.Reflection; using System.IO; static class Program { static void Main() { //添加程序集解析事件 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; //... 啟動應用窗體 } //當程序集加載失敗時調用此事件 static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { return LoadFromResource("ICSharpCode.SharpZipLib.dll"); } //加載資源轉為Assembly程序集 private static Assembly LoadFromResource(string resName) { Assembly ass = Assembly.GetExecutingAssembly(); using (Stream stream = ass.GetManifestResourceStream("AutoPublish.Resources." + resName)) { byte[] bt = new byte[stream.Length]; stream.Read(bt, 0, bt.Length); Assembly asm = Assembly.Load(bt);//轉換流到程序集 return asm; } return null; } }
實現原理:
把dll嵌入到exe程序的資源中,
並實現程序集加載失敗事件(當在程序目錄和系統目錄下找不到程序集觸發),
當找不到程序集時就從資源文件加載, 先轉換為字節數組再轉換到程序集返回給程序,
這樣dll就被加載到程序中了.
如果exe所在文件夾下有相應dll, 事件並不會被觸發!