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 ...
随机推荐
- 半个前端新手入门Electron的过程
前言 先说几句废话,本人是一名 web 后端开发,主语言是 java,在学 Electron 之前,只会一点点 HTML和 JavaScript.本文讲的也是我学习 Electron 的过程,而非教程 ...
- Object类的toString方法-Object类的equas方法
Object类的toString方法 Object 是类层次结构的根(最顶层)类.每个类都是用 Object 作为超(父)类. 所有对象(包括数组) 都实现这个类的方法 Person类默认继承了Obj ...
- Ubuntu 22.04 GCC Arm 12.2.rel1编译 DAPLink
ARMmbed / DAPLink 项目 仓库地址 https://github.com/ARMmbed/DAPLink Arm Mbed 应该属于Arm的机构或者是Arm资助的机构. 常用的 DAP ...
- 通过一个示例形象地理解C# async await 非并行异步、并行异步、并行异步的并发量控制
前言 接上一篇 通过一个示例形象地理解C# async await异步 我在 .NET与大数据 中吐槽前同事在双层循环体中(肯定是单线程了)频繁请求es,导致接口的总耗时很长.这不能怪前同事,确实难写 ...
- 论文翻译:2022_PercepNet+: A Phase and SNR Aware PercepNet for Real-Time Speech Enhancement
博客地址:凌逆战 (转载请注明出处) 论文地址:PercepNet+: 用于实时语音增强的相位和信噪比感知 PercepNet 引用格式: Ge X, Han J, Long Y, et al. Pe ...
- python正则分组匹配
import re s = ''' {"type":"buy","order_no":"202006161314138669164 ...
- 解决:ChatGPT too many requests in 1 hour.Try again later 怎么办?OpenAI 提示
ChatGPT 提示: Too many requests in 1 hour. Try again later. 如下图,我多次访问也出现同样的问题.中文意思是太多的请求数量在当前 1 个小时内,请 ...
- 虚拟机配置代理(虚拟机nat)
桥接 第一步:打开clash allow lan 第二步:找到宿主机在局域网中的IP地址 第三步:配置虚拟机代理 NAT 同上 注意 一.宿主机防火墙要配置好(直接关闭会也有效果, ...
- spring-in-action-day05-REST
1.创建RESTFUL端点 (1)创建get端点 (2)创建post端点 (3)创建put/patch端点 (4)创建delete端点 2.启用超媒体 3.消费REST端点 3.1使用RestTemp ...
- Google Guice 用户指南 - Ⅰ:概览
译者:kefate 原文:https://github.com/google/guice/wiki/Overview 大家好,我是kefate.今天开始我将会把Google Guice的官方文档陆续翻 ...