C# 把引用的dll嵌入到exe文件中


 

當發布的程序有引用其它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, 事件並不會被觸發!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM