• C# 如何将使用的Dll嵌入到.exe应用程序中?


    前言

    有没有想自己开发的exe保留一点神秘,不想让他人知道软件使用了哪些dll; 又或许是客户觉得一个软件里面的dll文件太多了,能不能简单一点,直接双击.exe就可以直接运行了,别搞那么多乱七八糟的。无论是主动还是被动,这就产生了一个需求,如何将软件调用的dll嵌入到exe中呢?

    详细实操

    接下来介绍一下方法,亲测有效,已用于实际项目中。

    我比较喜欢的方式是将软件的所有功能都已完成好了,最后再做这个dll嵌入功能。

    1 、将需要用到的dll添加的项目的引用中
    在这里插入图片描述
    可以看到dll的【复制本地】默认值是True,
    在做嵌入dll功能时,我们需要将【复制本地】值设置为False.
    在这里插入图片描述

    2、在项目中创建一个文件夹,用于存放用到的dll,比如我这里创建了MyDll的文件夹,将项目中用到的所有dll都放这里了。
    鼠标右键选中文件夹【MyDll】–选择【添加】—【现有项】—选择所有文件,将文件夹下的Dll全部添加到工程中。
    在这里插入图片描述
    将MyDll文件下的所有文件属性【生成操作】选择嵌入的资源
    在这里插入图片描述

    3 重要的一步是动态加载dll的代码部分了。 新建一个类LoadDll用于映射解析dll.
    其中InsertDllForm.MyDll是工程的命名空间+文件夹名称,需要自行替换为自己工程下的名称哈。

     class LoadDll
        {
            public static void LoadResourceDll()
            {
                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            }
    
            private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
            {
                string assName = new AssemblyName(args.Name).Name;
                string resName = "InsertDllForm.MyDll." + assName + ".dll";
    
    
                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resName))
                {
                    if (stream == null)
                    {
                        return null;
                    }
                    Byte[] assemblyData = new Byte[stream.Length];
                    stream.Read(assemblyData, 0, assemblyData.Length);
                    return Assembly.Load(assemblyData);
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    4、最后一步,在Main函数入口调用加载dll的函数。 LoadDll.LoadResourceDll();

    static class Program
        {
            /// 
            /// 应用程序的主入口点。
            /// 
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
               
                //加载解析嵌入的Dll
                LoadDll.LoadResourceDll();
    
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new MainForm());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    简要步骤

    1 添加引用,将需要用到的dll添加的项目的引用中,并设置属性【复制本地】为False

    2 将引用放到一个文件夹下,并将里面的dll添加到工程,设置属性【生成操作】为嵌入的资源

    3 使用反射Reflection,编写代码加载Dll的功能

    4 主函数Main()调用加载Dll的功能 LoadResourceDll

    在这里插入图片描述
    结构如图。

    测试项目运行如图所示。
    在这里插入图片描述

  • 相关阅读:
    适用于4×4MiMo 4G/5G,支持GNSS和WiFi 6E的车载天线解决方案
    wgcna 官网教程II.Consensus analysis of female and male liver expression data
    两整数之和 ---- 位运算
    Node基础
    trucksim常见问题
    EXCEL使用VBA一键批量转换成PDF
    <dependencyManagement>的作用
    FutureTask源码深度剖析
    探索生成式AI的未来:Chat与Agent的较量与融合
    开启婚恋新市场!!!
  • 原文地址:https://blog.csdn.net/weixin_40314351/article/details/132557524