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

posted on 2022-06-13 17:14  日月中的神  阅读(2832)  评论(0编辑  收藏  举报

导航