原文: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当中相关推荐

  1. WPF程序将DLL嵌入到EXE的两种方法

    2019独角兽企业重金招聘Python工程师标准>>> WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了> ...

  2. 威金病毒、维金病毒、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目录下 ...

  3. 将xml文件打包进dll(或exe)

    经常,为了安全,我们需要将xml文件加密或者打包进dll文件中,那么如何将xml文件打包进dll中呢?在.net中,为我们提供了很好的方式: 选中该xml文件,将其属性中的"生成操作&quo ...

  4. C#程序将DLL包进EXE方法

    有时候我们在发布程序的时候只想发布一个EXE,而编写程序的时候往往会有多个DLL,这个时候如果能把这些DLL装进EXE将是一个很令人振奋的事情,事实上对于C#程序有很多方法如下: 1. 使用微软的IL ...

  5. vs dll必须和exe在同一个目录_Win10系统丢失 .dll 文件的三种解决方案教程

    有时候开机或打开一个软件时,系统会提示无法启动程序,这是怎么回事呢?这是因为计算机丢失某个或某些dll文件,由于系统本身不存在这些运行库文件,需要进行添加才能使用该软件. 方法一:下载丢失的.dll文 ...

  6. 0x00007FFEB46D3F57 (mfc140ud.dll)处(位于*.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000000

    在非MFC程序中,添加MFC支持时,出现了如下错误,经调试终于解决,问题描述与解决方法如下: 问题描述1:0x00007FFEB46D3F57 (mfc140ud.dll)处(位于*.exe 中)引发 ...

  7. .dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突

    .dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问冲突 在进行c++代码编译时,出现了.dll处位于.exe中引发的异常:0xC0000005:读取位置XXX时发生访问 ...

  8. 【Windows8开发】关于WinRT组件,WinRT dll,Win32 dll,WinRT exe组件的一些尝试

    随着Win8的推出,提出了很多新的概念,比如WinRT Component,WinRT dll,WinRT exe component等.基于这些新的概念,进行了很多尝试,本文会把结果分享给大家,希望 ...

  9. 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 ...

最新文章

  1. Windows下MemCache多端口安装配置
  2. ExtJS4.2学习(八)表格限制输入数据的类型
  3. j2me程序发布到手机
  4. Nginx高效学习手册(建议收藏)
  5. 大学加权平均分计算器_英国排名前20的大学GPA要求
  6. Android(三)——将程序打包成APK文件,进行APK签名以及反编译APK
  7. TCP/IP 学习 --- 2
  8. AOP概述及实现原理
  9. 因为CSS文件编码问题IE6无法正确解析CSS
  10. 原生JS事件中,return false 和 preventDefault() 的区别
  11. 本计算机无法加入家庭组,win10系统无法加入家庭组是怎么回事?
  12. 《操作系统真象还原》——0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的...
  13. 关于云优CMS系统模板标签调用列表随机显示的代码rand()标签适用
  14. IndentationError:unindent does not match any outer indentation解决方案
  15. kettle 6.1.0.1 mysql_kettle连接数据库报错:Error occured while trying to connect
  16. java唱哪首歌好听_非常适合KTV演唱的100首新歌,Hold住全场,非常好听!
  17. oppo Reno 5 pro​​手机打开USB调试步骤(oppo手机大同小异,其他品牌也适用)
  18. 9个很棒的CSS边框技巧
  19. 强生单剂新冠疫苗对“德尔塔”有效;赛诺菲巴斯德将每年投资4亿欧元建mRNA疫苗中心 | 美通社头条...
  20. 10分钟pandas教程

热门文章

  1. 织梦自定义表单地区联动类型不可用的解决办法
  2. JDBC模板对象是多例的
  3. django mysql settings
  4. 网络基础Cisco路由交换四
  5. HDFS Federation
  6. 0603学术诚信与职业道德
  7. Android图片编码机制深度解析(Bitmap,Skia,libJpeg)
  8. Struts2之控制标签
  9. java项目eclipse上tomcat部署后项目添加不进去
  10. Kafka版本介绍Version2.4.0