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