C#winform将引用的DLL嵌入exe

在软件开发的过程中不可避免需要引用第三方类库或自定义类库(DLL), 引用的DLL一般在生成项目时会拷贝至Debug或Release目录中, 造成生成目录中文件繁多的问题,鉴于此现象希望将DLL封装在项目的exe文件中。

好了,话不多说,上菜~~~~~~~~~~

1 项目引用DLL

  1. 如果您是高手,可以跳过“标题1”内容,直接查看DLL如何嵌入exe即可(“标题2”);
  2. 这里添加DLL选择任何路径即可,无需关心原DLL的路径。

1.1 项目-鼠标右击-点击添加引用;

在这里插入图片描述

1.2 点击“浏览”;

在这里插入图片描述

1.3 添加选中DLL

这里以《Toolkit.dll》为例演示

在这里插入图片描述

1.4 勾选引用的DLL,点击“确定”

在这里插入图片描述

1.5 添加成功后

在这里插入图片描述

2 DLL嵌入exe

2.1 打开引用DLL属性窗口

在引用列表,找到引用的DLL,右击-属性

在这里插入图片描述

2.2 将“复制本地”项设为“false”

在这里插入图片描述

2.3 双击打开“Resources.resx”

在这里插入图片描述

2.4 选择添加资源-添加现有文件

在这里插入图片描述

2.5 添加DLL至资源

在弹出的对话框中,找到2.2中操作的DLL,然后点击“打开”

在这里插入图片描述

2.6 Main函数中添加如下代码

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string info = args.Name;
    string strDllName = string.Empty;
    if (info.Contains(','))
    {
        strDllName = info.Split(',').First();
    }
    else
    {
        int index = info.IndexOf(".dll", StringComparison.Ordinal);
        if (index >= 0) strDllName = info.Remove(index);
    }
    if (string.IsNullOrWhiteSpace(strDllName) ||strDllName.EndsWith(".resources")) return null;
    string baseName = $"{typeof(Program).Namespace}.Properties.Resources";
    var assembly = System.Reflection.Assembly.GetExecutingAssembly();
    var rm = new System.Resources.ResourceManager(baseName, assembly);
    byte[] bytes = (byte[])rm.GetObject(strDllName);
    return System.Reflection.Assembly.Load(bytes);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值