首先在资源管理里面将需要使用的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. elasticsearch中使用runtime fields

    1.背景 在我们使用es的开发过程中可能会遇到这么一种情况,比如我们的线路名称字段lineName字段在设置mapping的时候使用的是text类型,但是后期发现需要使用这个字段来进行聚合操作,那么我 ...

  2. 【分析笔记】Linux 内核自旋锁的理解和使用原则

    自旋锁简单说明: 自旋锁主要解决在竞态并发下,保护执行时间很短的临界区.它只允许一个执行单位进入临界区,在该执行单位离开前,其它的执行单位将会在进入临界区前不停的循环等待(即所谓的自旋),直至该执行单 ...

  3. rust 模块、路径、项目类型等相关内容

    rust 模块路径 转载 https://blog.csdn.net/wowotuo/article/details/107591501 rust 项目编译类型 转载 https://blog.51c ...

  4. Vue 24 props

    1 简介 props主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与data.el.ref是一个级别的配置项 2 一个简单示例 1)StudentComp.vue <template ...

  5. mysql16 sql优化-order by-GROUP BY

    1.简要说明   在sql中常常用到order by,排序对于sql的查询速度有较大的的影响.mysql支持两种排序方式,FileSort和Index,Index效率高,它指MySQL扫描索引本身完成 ...

  6. Linux06-常用命令 日期 日历 查找 过滤

    1.date  日期 2.cal 日历 3.find 查找 4.locate 查找 5.grep  过滤 1.时间日期类 date指令-显示当前日期 1)指令: date (功能描述:显示当前时间) ...

  7. JS 计算两个时间戳相差年月日时分秒

    // JS 计算两个时间戳相差年月日时分秒 calculateDiffTime(startTime, endTime, type) { var runTime = parseInt(endTime - ...

  8. 让你VS Code的通过插件扩展,拥有了三头六臂

    VS Code 有一个很强大的功能就是支持插件扩展,让你的编辑器仿佛拥有了三头六臂. 安装 VS Code 插件 提醒:当完成了vscode这些配置后,当我们换一台电脑时,不会还得重新配置吧?放心,我 ...

  9. 合肥光源纵向震荡数据源相关PV

    中控室束测界面上加上了BCM部分,看下面截图,可以发现里面的两张二维图像内容还是蛮丰富的,我想其数据很值得大家研究研究,现把相关PV公布给大家,感兴趣的可以通过这两幅图的数据计算出更多的物理量,比如每 ...

  10. Nginx基础02:配置文件nginx.conf(Part1)

    我们使用Nginx主要是通过其配置文件nginx.conf来实现的.按照一定的规则,编写特定的指令,可以帮助我们实现对Web服务的控制!所以,学习Nginx的用法,几乎就是学习nginx.conf! ...