首先在资源管理里面将需要使用的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中的更多相关文章

  1. C#中将DLL文件打包到EXE文件

    1:在工程目录增加dll目录,然后将dll文件复制到此目录,例如: 2:增加引用,定位到工程的dll目录,选中要增加的dll文件 3:修改dll文件夹下面的dll文件属性 选中嵌入式资源,不复制. 4 ...

  2. 将exe和dll文件打包成单一的启动文件

    当我们用 VS 或其它编程工具生成了可执行exe要运行它必须要保证其目录下有一大堆dll库文件,看起来很不爽,用专业的安装程序生成软件又显得繁琐,下面这个方法教你如何快速把exe文件和dll文件打包成 ...

  3. 如何把py文件打包成exe可执行文件

    如何把py文件打包成exe可执行文件 1.安装 pip install pyinstaller 或者 pip install -i https://pypi.douban.com/simple pyi ...

  4. python的py文件打包成exe

    一.首先需要安装Pyinstaller-- 使用pip来安装模块 (我电脑上装的是python的一个编译环境Anaconda,如果电脑上装的是python自带的IDE的话,就直接进入python的安装 ...

  5. 将py文件打包为exe文件方法

    前提: pip是依赖python的,首先检查下windows机器上有没有安装python,或者有没有添加到环境变量中,如果都没有需要安装或者加入环境变量 安装pip 下载地址: https://pyp ...

  6. windows下使用pyinstaller将多个目录的Python文件打包成exe可执行文件

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 需要将一个工程涉及两个目录的模块文件打包成exe,打包环境如 ...

  7. 用MT.exe将exe中的manifest文件提取出来和将manifest文件放入exe中

     前一种方法是将manifest文件放入exe中,但是要记得需要在工程中设置 这样的话exe中就不存在manifest了,在debug目录下就会看到相应的manifest文件.后者是将exe中的man ...

  8. 将 Python3 文件打包成 exe 文件

    我们用 Python 写好的代码,如何给别人在没有配置 Python 环境的情况下直接使用呢?尤其是面向 windows 众. 因为 Python 是一门解释性的语言,离开了 Python 解释器,P ...

  9. windows下如何将Python文件打包成.exe可执行文件

    在使用Python做开发的时候,时不时会给自己编写了一些小工具辅助自己的工作,但是由于开发依赖环境问题,多数只能在自己电脑上运行,拿到其它电脑后就没法运行了.这显得很不方便,不符合我们的初衷,那么有没 ...

  10. webService接口的py文件打包成exe

    (一)webService接口的py文件打包成exe,在python3.5版本.pyInstaller3.2版本.pywin32-219.win-amd64-py3.5版本打包时报错,原因可能是pyi ...

随机推荐

  1. Redis 正则扫描key并删除

    扫描key /** * @param key * @return * @Description: 通过Scan的方式迭代key */ public Set<String> scanKeys ...

  2. 前端基础知识-react(一)个人学习记录 _

    待补充 reactive和ref

  3. 线上排查:内存异常使用导致full gc频繁

    线上排查:内存异常使用导致full gc频繁 问题系统 日常巡检发现,应用线上出现频繁full gc 现象 应用线上出现频繁full gc 排查过程 分析dump 拉dump文件:小插曲:dump时如 ...

  4. 【unity】EventSystem.current.IsPointerOverGameObject()报空指针错误的解决

    我前几天遇见了EventSystem.current.IsPointerOverGameObject()这么个问题,只要我一触发就给我报空指针!!我那时根本就没动这段码,但就是报错!!!卡了老子十小时 ...

  5. redis-07主从复制

    转 https://www.jianshu.com/p/06ab9daf921d https://www.jianshu.com/p/06ab9daf921d 1 基本说明 我们所说的主从复制,主机数 ...

  6. 定位bug

    软件测试阶段:单元测试,集成测试,系统测试,验收测试 测试人员参与的软件测试阶段一般来说只有集成测试和系统测试阶段.集成测试阶段主要测试的是接口:系统测试阶段主要是功能测试,兼容性测试等,涉及到定位b ...

  7. osx使用alfred集成有道查词

    概述 使用 mac 的同学应该经常会使用 alfred 这个软件, 主要能随时能够通过一个快键键打开查询窗口, 方便的搜索或打开软件, 文件等等, 同时也可以集成脚本方便实现其它的功能. 在日常使用的 ...

  8. http协议介绍,token和session原理

    1.http协议 https://www.cnblogs.com/lauhp/p/8979393.html 1. 定义 http Hyper Text Transfer Protocol,超文本传输协 ...

  9. LOJ 数列分块入门 6

    \(\text{Solution}\) 涉及到插入,分块需要动态维护块内的元素及相对位置 于是妙用 \(\text{vector}\) 学到了 \(insert\) 操作,在某个迭代器前插入元素 这样 ...

  10. 题解 P4317 花神的数论题

    并不难,但是因为各种 SB 原因调了 1145141919810min(悲 我们会发现 \(\operatorname{sum}\) 其实很小,顶多就 \(50\),这启发我们统计每个 \(\oper ...