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, 事件并不会被触发!
将DLL放入到资源中,运行时自动加载 将软件需要用到的DLL文件放入资源文件中,在软件启动时自动将资源文件中的DLL加载出来
AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs senderArgs) { Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = new AssemblyName(executingAssembly.FullName).Name; string str2 = new AssemblyName(senderArgs.Name).Name; string str3 = str2 + ".dll"; using (Stream stream = executingAssembly.GetManifestResourceStream(str3)) { byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, buffer.Length); return Assembly.Load(buffer); } };

 

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号