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, 事件并不会被触发!

 

posted @ 2016-09-20 15:27  Hanf  阅读(7970)  评论(1编辑  收藏  举报
Copyright © 2008-2016 Hanf All Rights Reserved