C#将DLL嵌入到exe当中
一、将dll文件加入工程
1.找到dll文件
可以在项目的“引用”下找到dll,并且根据属性中的“路径”找到文件所在目录;也可以使用bin目录下自动生成(其实就是复制)的dll文件
这里需要注意,“引用”下的dll,需要设置“复制本地”为False,这样在bin目录下生成exe的时候就不会顺便复制dll了(感觉这步可要可不要)。
2.加入工程
可以对着项目(我的即“ShadowSuHelper”)右键->添加->现有项;或者更简单的,复制1中找到的dll,直接在工程中粘贴
加入dll后,工程结构如上图,引用中的还需要保留(否则代码编译不通过);此外.dll文件也是必须的(运行时需要调用)。最后,别忘了对刚加入的两个dll属性中“生成操作”改为“嵌入的资源”,这样生成的exe就会嵌入这两个dll,体积显著增大,哈哈。
二、添加AssemblyResolve处理函数
添加了AssemblyResolve的处理函数后,当调用dll找不到时,就会回调该函数,我们只需要在这个函数中,将嵌入exe的dll获取并解析返回即可。这个事件必须在调用dll之前添加,否则就没用了,这里我们选择在Program.cs的Main()方法中设置。
首先引入命名空间
using System.Reflection;
然后在Main方法开头加入
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
其中的CurrentDomain_AssemblyResolve就是我们的回调函数了,完整代码如下:
static void Main() {AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1()); }private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {string resourceName = "ShadowSuHelper." + new AssemblyName(args.Name).Name + ".dll";using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)){byte[] assemblyData = new byte[stream.Length];stream.Read(assemblyData, 0, assemblyData.Length);return Assembly.Load(assemblyData);} }
可以在CurrentDomain_AssemblyResolve中设置断点查看,会发现当程序中首次调用到HtmlAgilityPack.dll或者Newtonsoft.Json.dll的方法时会回调该函数,并且不会再报找不到dll的错误了。
C#将DLL嵌入到exe当中相关推荐
- WPF程序将DLL嵌入到EXE的两种方法
2019独角兽企业重金招聘Python工程师标准>>> WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了> ...
- 威金病毒、维金病毒、Viking、logo1_.exe专杀 vdll.dll、logo1_.exe、rundl132.exe、_desktop.ini、、0Sy.exe、图标变花...
威金病毒.维金病毒.Viking.logo1_.exe专杀 vdll.dll.logo1_.exe.rundl132.exe._desktop.ini..0Sy.exe.图标变花 Windows目录下 ...
- 将xml文件打包进dll(或exe)
经常,为了安全,我们需要将xml文件加密或者打包进dll文件中,那么如何将xml文件打包进dll中呢?在.net中,为我们提供了很好的方式: 选中该xml文件,将其属性中的"生成操作&quo ...
- C#程序将DLL包进EXE方法
有时候我们在发布程序的时候只想发布一个EXE,而编写程序的时候往往会有多个DLL,这个时候如果能把这些DLL装进EXE将是一个很令人振奋的事情,事实上对于C#程序有很多方法如下: 1. 使用微软的IL ...
- vs dll必须和exe在同一个目录_Win10系统丢失 .dll 文件的三种解决方案教程
有时候开机或打开一个软件时,系统会提示无法启动程序,这是怎么回事呢?这是因为计算机丢失某个或某些dll文件,由于系统本身不存在这些运行库文件,需要进行添加才能使用该软件. 方法一:下载丢失的.dll文 ...
- 0x00007FFEB46D3F57 (mfc140ud.dll)处(位于*.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000000
在非MFC程序中,添加MFC支持时,出现了如下错误,经调试终于解决,问题描述与解决方法如下: 问题描述1:0x00007FFEB46D3F57 (mfc140ud.dll)处(位于*.exe 中)引发 ...
- .dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突
.dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突 在进行c++代码编译时,出现了.dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问 ...
- 【Windows8开发】关于WinRT组件,WinRT dll,Win32 dll,WinRT exe组件的一些尝试
随着Win8的推出,提出了很多新的概念,比如WinRT Component,WinRT dll,WinRT exe component等.基于这些新的概念,进行了很多尝试,本文会把结果分享给大家,希望 ...
- First-chance exception at 0x774CEB23 (ntdll.dll) in XXX.exe: 0xC0000005: Access violation writing
语音对讲程序中在关闭对讲时总是报错"First-chance exception at 0x774CEB23 (ntdll.dll) in XXX.exe: 0xC0000005: Acce ...
最新文章
- Windows下MemCache多端口安装配置
- ExtJS4.2学习(八)表格限制输入数据的类型
- j2me程序发布到手机
- Nginx高效学习手册(建议收藏)
- 大学加权平均分计算器_英国排名前20的大学GPA要求
- Android(三)——将程序打包成APK文件,进行APK签名以及反编译APK
- TCP/IP 学习 --- 2
- AOP概述及实现原理
- 因为CSS文件编码问题IE6无法正确解析CSS
- 原生JS事件中,return false 和 preventDefault() 的区别
- 本计算机无法加入家庭组,win10系统无法加入家庭组是怎么回事?
- 《操作系统真象还原》——0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的...
- 关于云优CMS系统模板标签调用列表随机显示的代码rand()标签适用
- IndentationError:unindent does not match any outer indentation解决方案
- kettle 6.1.0.1 mysql_kettle连接数据库报错:Error occured while trying to connect
- java唱哪首歌好听_非常适合KTV演唱的100首新歌,Hold住全场,非常好听!
- oppo Reno 5 pro​​手机打开USB调试步骤(oppo手机大同小异,其他品牌也适用)
- 9个很棒的CSS边框技巧
- 强生单剂新冠疫苗对“德尔塔”有效;赛诺菲巴斯德将每年投资4亿欧元建mRNA疫苗中心 | 美通社头条...
- 10分钟pandas教程