别忘了对刚加入的两个dll属性中“生成操作”改为“嵌入的资源”

时间:2021-09-23 04:48:01

原文:C#将DLL嵌入到exe傍边

一、将dll文件插手工程 1.找到dll文件

可以在项目的“引用”下找到dll,并且按照属性中的“路径”找到文件地址目录;也可以使用bin目录下自动生成(其实就是复制)的dll文件 

别忘了对刚加入的两个dll属性中“生成操作”改为“嵌入的资源”

 
这里需要注意,“引用”下的dll,需要设置“复制本地”为False,这样在bin目录下生成exe的时候就不会趁便复制dll了(觉得这步可要可不要)。 2.插手工程

可以对着项目(我的即“ShadowSuHelper”)右键->添加->现有项;或者更简单的,复制1中找到的dll,直接在工程中粘贴 

别忘了对刚加入的两个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的错误了。