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);
            }
        }
    }

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

static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
           
            //加载解析嵌入的Dll
            LoadDll.LoadResourceDll();

            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }

简要步骤

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

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

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

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

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

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

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C# Winform嵌入基恩士应用程序exe,可以使用Process类来启动应用程序,并将其嵌入到窗体。以下是实现步骤: 1. 打开Visual StudioWinform项目,并在工具箱添加一个Panel控件。 2. 在代码使用Process类的Start方法来启动基恩士应用程序exe,并将其嵌入到Panel控件。 3. 设置基恩士应用程序exe的属性和方法,以便与其进行交互。 以下是代码示例: ```csharp using System.Diagnostics; using System.Windows.Forms; namespace WinformApp { public partial class Form1 : Form { private Process process; public Form1() { InitializeComponent(); // 启动基恩士应用程序exe process = new Process(); process.StartInfo.FileName = "KeenShine.exe"; process.StartInfo.Arguments = ""; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.Start(); // 将基恩士应用程序exe嵌入到Panel控件 process.WaitForInputIdle(); SetParent(process.MainWindowHandle, panel1.Handle); // 设置窗体大小和位置 process.StartInfo.WindowStyle = ProcessWindowStyle.Normal; process.WaitForInputIdle(); MoveWindow(process.MainWindowHandle, 0, 0, panel1.Width, panel1.Height, true); // 设置基恩士应用程序exe的属性和方法 process.StandardInput.WriteLine("Command1"); var result = process.StandardOutput.ReadLine(); // ... } protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); // 关闭基恩士应用程序exe process.Kill(); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll")] private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint); } } ``` 在上面的代码,panel1是Winform的一个Panel控件,用来显示基恩士应用程序exe。你需要根据实际情况设置基恩士应用程序exe的属性和方法。需要注意的是,在关闭窗体时,需要使用Process类的Kill方法来关闭基恩士应用程序exe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值