C#将引用的dll嵌入到exe文件中
应用场景:当发布的程序有引用其它dll, 又只想发布一个exe时就需要把dll打包到exe;
方法如下:
1、 项目右键选择“属性”;
2、 添加资源文件:在属性设置界面选择“资源”选项卡,点击“添加现有文件”,选择需嵌入的dll文件;添加资源后dll将拷贝到项目文件夹下的“Resources”子文件夹下;
3、 添加上一步添加的dll文件;
4、 Dll属性复制本地设置为False;
5、 在应用程序的主入口点添加一下代码:
using System; using System.Reflection; using System.Windows.Forms; namespace OpticalShutterReceiving { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); DllClass.LoadResourceDll();//引用的dll嵌入到exe文件需加上这行代码 Application.Run(new Form1(){ StartPosition = FormStartPosition.CenterScreen }); } } class DllClass { public static void LoadResourceDll() { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); } private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", ""); dllName = dllName.Replace(".", "_"); if (dllName.EndsWith("_resources")) return null; string Namespace = Assembly.GetEntryAssembly().GetTypes()[0].Namespace; System.Resources.ResourceManager rm = new System.Resources.ResourceManager(Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly()); byte[] bytes = (byte[])rm.GetObject(dllName); return System.Reflection.Assembly.Load(bytes); } } }
Victor
flyliusheng