C# 将Dll文件打包到exe中
首先在资源管理里面将需要使用的dll添加进入

然后将dll文件的生成操作改成嵌入的资源


然后新建一个类 LoadResourceDll.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Text.RegularExpressions;
7 using System.Windows.Forms;
8 using System.Diagnostics;
9 using System.Reflection;
10
11 namespace LegendTool
12 {
13 public static class LoadResoureDll
14 {
15 /// <summary> 已加载DLL
16 /// </summary>
17 private static Dictionary<string, Assembly> LoadedDlls = new Dictionary<string, Assembly>();
18 /// <summary> 已处理程序集
19 /// </summary>
20 private static Dictionary<string, object> Assemblies = new Dictionary<string, object>();
21 /// <summary> 在对程序集解释失败时触发
22 /// </summary>
23 /// <param name="sender">AppDomain</param>
24 /// <param name="args">事件参数</param>
25 private static Assembly AssemblyResolve(object sender, ResolveEventArgs args)
26 {
27 try
28 {
29 //程序集
30 Assembly ass;
31 //获取加载失败的程序集的全名
32 var assName = new AssemblyName(args.Name).FullName;
33 //判断Dlls集合中是否有已加载的同名程序集
34 if (LoadedDlls.TryGetValue(assName, out ass) && ass != null)
35 {
36 LoadedDlls[assName] = null;//如果有则置空并返回
37 return ass;
38 }
39 else
40 {
41 throw new DllNotFoundException(assName);//否则抛出加载失败的异常
42 }
43 }
44 catch (System.Exception ex)
45 {
46 return null;
47 MessageBox.Show("error:\n位置:AssemblyResolve()!\n描述:" + ex.Message);
48 }
49 }
50
51 /// <summary> 注册资源中的dll
52 /// </summary>
53 /// <param name="pattern">*表示连续的未知字符,_表示单个未知字符,如*.dll</param>
54 public static void RegistDLL(string pattern = "*.dll")
55 {
56 System.IO.Directory.GetFiles("", "");
57 //获取调用者的程序集
58 var ass = new StackTrace(0).GetFrame(1).GetMethod().Module.Assembly;
59 //判断程序集是否已经处理
60 if (Assemblies.ContainsKey(ass.FullName))
61 {
62 return;
63 }
64 //程序集加入已处理集合
65 Assemblies.Add(ass.FullName, null);
66 //绑定程序集加载失败事件(这里我测试了,就算重复绑也是没关系的)
67 AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve;
68 //获取所有资源文件文件名
69 var res = ass.GetManifestResourceNames();
70 var regex = new Regex("^" + pattern.Replace(".", "\\.").Replace("*", ".*").Replace("_", ".") + "$", RegexOptions.IgnoreCase);
71 foreach (var r in res)
72 {
73 //如果是dll,则加载
74 if (regex.IsMatch(r))
75 {
76 try
77 {
78 var s = ass.GetManifestResourceStream(r);
79 var bts = new byte[s.Length];
80 s.Read(bts, 0, (int)s.Length);
81 var da = Assembly.Load(bts);
82 //判断是否已经加载
83 if (LoadedDlls.ContainsKey(da.FullName))
84 {
85 continue;
86 }
87 LoadedDlls[da.FullName] = da;
88 }
89 catch (Exception ex)
90 {
91 MessageBox.Show("error:加载dll失败\n位置:RegistDLL()!\n描述:" + ex.Message);
92 }
93 }
94 }
95 }
96 }
97 }
在程序入库添加引用
LoadResoureDll.RegistDLL();

参考原文:https://blog.csdn.net/yanhuatangtang/article/details/76228155
C# 将Dll文件打包到exe中的更多相关文章
- C#中将DLL文件打包到EXE文件
1:在工程目录增加dll目录,然后将dll文件复制到此目录,例如: 2:增加引用,定位到工程的dll目录,选中要增加的dll文件 3:修改dll文件夹下面的dll文件属性 选中嵌入式资源,不复制. 4 ...
- 将exe和dll文件打包成单一的启动文件
当我们用 VS 或其它编程工具生成了可执行exe要运行它必须要保证其目录下有一大堆dll库文件,看起来很不爽,用专业的安装程序生成软件又显得繁琐,下面这个方法教你如何快速把exe文件和dll文件打包成 ...
- 如何把py文件打包成exe可执行文件
如何把py文件打包成exe可执行文件 1.安装 pip install pyinstaller 或者 pip install -i https://pypi.douban.com/simple pyi ...
- python的py文件打包成exe
一.首先需要安装Pyinstaller-- 使用pip来安装模块 (我电脑上装的是python的一个编译环境Anaconda,如果电脑上装的是python自带的IDE的话,就直接进入python的安装 ...
- 将py文件打包为exe文件方法
前提: pip是依赖python的,首先检查下windows机器上有没有安装python,或者有没有添加到环境变量中,如果都没有需要安装或者加入环境变量 安装pip 下载地址: https://pyp ...
- windows下使用pyinstaller将多个目录的Python文件打包成exe可执行文件
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 需要将一个工程涉及两个目录的模块文件打包成exe,打包环境如 ...
- 用MT.exe将exe中的manifest文件提取出来和将manifest文件放入exe中
前一种方法是将manifest文件放入exe中,但是要记得需要在工程中设置 这样的话exe中就不存在manifest了,在debug目录下就会看到相应的manifest文件.后者是将exe中的man ...
- 将 Python3 文件打包成 exe 文件
我们用 Python 写好的代码,如何给别人在没有配置 Python 环境的情况下直接使用呢?尤其是面向 windows 众. 因为 Python 是一门解释性的语言,离开了 Python 解释器,P ...
- windows下如何将Python文件打包成.exe可执行文件
在使用Python做开发的时候,时不时会给自己编写了一些小工具辅助自己的工作,但是由于开发依赖环境问题,多数只能在自己电脑上运行,拿到其它电脑后就没法运行了.这显得很不方便,不符合我们的初衷,那么有没 ...
- webService接口的py文件打包成exe
(一)webService接口的py文件打包成exe,在python3.5版本.pyInstaller3.2版本.pywin32-219.win-amd64-py3.5版本打包时报错,原因可能是pyi ...
随机推荐
- Java入门与进阶P-4.5+P-4.6
逻辑类型 关系运算的结果是要给逻辑值,true或false.这个值可以保存在一个对应的逻辑类型变量中,这样的变量类型是boolean 布尔是为了纪念George Boole对逻辑计算得到贡献 bool ...
- js函数中的this指向
写代码的时候遇到这个问题了,在这里复习一下 非箭头函数 非箭头函数的this指向比较好理解,就是调用这个函数的对象,举个栗子: var obj = { foo: { bar: 3, foo:{ bar ...
- 【随笔记】Littlevgl 8.x 踩过的坑
在多线程并发使用的时候,总是在运行过程中莫名其妙的 crash,后面才意识到 LVGL 本身不支持并发,加了互斥锁解决了. 在引入矢量字库时(freetype),又有启动时会概率性 crash 的问题 ...
- .Net Core对于`RabbitMQ`封装分布式事件总线
首先我们需要了解到分布式事件总线是什么: 分布式事件总线是一种在分布式系统中提供事件通知.订阅和发布机制的技术.它允许多个组件或微服务之间的协作和通信,而无需直接耦合或了解彼此的实现细节.通过事件总线 ...
- Vue32 插槽
1 简介 是一种组件间通信的方式,让父组件可以向子组件指定位置插入 html 结构.子组件中的提供给父组件使用的一个占位标签,用<slot></slot> 表示,父组件可以在这 ...
- 微信小程序分类菜单激活状态跟随列表滚动自动切换
这里主要用到微信小程序提供的SelectorQuery获取页面节点信息实现,组件用的是微信小程序的scroll-view 逻辑就是获取右侧盒子的节点信息,获取右侧子分类的节点信息,当子分类滑动到顶部的 ...
- LG P1919
\(\text{FFT}\) #include <cstdio> #include <cmath> #include <iostream> #include < ...
- 国内“谁”能实现chatgpt,短期穷出的类ChatGPT简评(算法侧角度为主),以及对MOSS、ChatYuan给出简评,一文带你深入了解宏观技术路线。
1.ChatGPT简介[核心技术.技术局限] ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于202 ...
- HTML5----响应式(自适应)网页设计(自动适应屏幕大小)
HTML5----响应式(自适应)网页设计(自动适应屏幕大小) 现在,很多项目都需要做响应式或者自适应的来适应我们不同屏幕尺寸的手机,电脑等设备,那么就需要我们在页面上下功夫,但移动端的布局不同于pc ...
- refactorObjProps:裁剪、添加对象字段或更新字段内容
介绍 根据模板,自动对一个 JS 对象的字段进行裁剪.添加或更新字段类型. 比如,做一个设置功能,其设置的数据(对象)存储在 localStorage 中.如果对象的字段名称更新了.或增加了一个新的字 ...