当前位置: 首页 > news >正文

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();//加载解析嵌入的DllLoadDll.LoadResourceDll();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MainForm());}}

简要步骤

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

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

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

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

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

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

http://www.lryc.cn/news/151069.html

相关文章:

  • 【LeetCode】剑指 Offer Ⅱ 第5章:哈希表(6道题) -- Java Version
  • x86 汇编手册快速入门
  • WPF C# Binding绑定不上的解决情况
  • 【UE 材质】实现方形渐变、中心渐变材质
  • PHP旅游管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页
  • java内存模型讨论及案例分析
  • 对战ChatGPT,创邻科技的Graph+AI会更胜一筹吗?
  • 9月2日,每日信息差
  • uni-app之android项目云打包
  • C++的智能指针和可变参数模板详解
  • Docker及常用数据库安装
  • 前端使用 JavaScript 检测用户是否在线的6种方法
  • Windows下Redis的安装
  • SpringBoot第45讲:SpringBoot定时任务 - Timer实现方式
  • 01背包(换汤不换药)
  • c++ folly::baton
  • 05.sqlite3学习——DML(数据管理:插入、更新、删除)
  • Netty-ChannelPipeline
  • 从入门到精通,30天带你学会C++【第六天:与或非三兄弟和If判断语句(博主目前最长文章,2514字)】(学不会你找我)
  • 如何快速找出占用空间最大的文件?
  • 算法:分治思想处理归并递归问题
  • 小白学Go 基础02-了解Go语言的诞生与演进
  • python中如何将十进制转成二进制
  • 数据结构--5.0.1图的存储结构
  • 解决win10 wsl子系统安装的ubuntu环境中lsof,netstat命令查看端口没有任何输出的问题
  • 【OpenFeign】OpenFeign结合Hystrix和Sentinel实现熔断降级
  • 软件工程(十) 需求工程之需求开发与管理
  • C++网狐服务器引入开源日志库spdlog
  • 【C++】—— c++11之智能指针
  • html5——前端笔记