标签:detail 功能 exe 加载 pyc gas ring reac obj
原文:三种方法,让WPF项目生成单文件
在使用WPF写一些小工具时,往往需要将多个DLL文件嵌入到EXE文件里,生成单文件。这里介绍三种方案:
第一步,在项目中新建Resources
文件夹,把需要的dll文件拷贝到该目录中(可以是多个dll文件),然后修改每个文件的属性,将生成操作改为嵌入的资源,例如:
App.xaml.cs
文件,添加程序集解析失败事件,并加载指定的嵌入资源。修改后内容为:
- using System;
- using System.Collections.Generic;
- using System.Configuration;
- using System.Data;
- using System.IO;
- using System.Linq;
- using System.Reflection;
- using System.Threading.Tasks;
- using System.Windows;
-
- namespace Embed
- {
- /// <summary>
- /// App.xaml 的交互逻辑
- /// </summary>
- public partial class App : Application
- {
- readonly string[] dlls = new string[] { "Newtonsoft.Json" }; // 去掉后缀名
- public App()
- {
- AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
- }
-
- private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
- {
- string resources = null;
- foreach (var item in dlls)
- {
- if (args.Name.StartsWith(item))
- {
- resources = item + ".dll";
- break;
- }
- }
- if (string.IsNullOrEmpty(resources)) return null;
-
- var assembly = Assembly.GetExecutingAssembly();
- resources = assembly.GetManifestResourceNames().FirstOrDefault(s => s.EndsWith(resources));
-
- if (string.IsNullOrEmpty(resources)) return null;
-
- using (Stream stream = assembly.GetManifestResourceStream(resources))
- {
- if (stream == null) return null;
- var block = new byte[stream.Length];
- stream.Read(block, 0, block.Length);
- return Assembly.Load(block);
- }
- }
- }
- }
其中dlls
数组内容为Resources
目录下去掉后缀的文件名。比如Resources
目录下有Newtonsoft.Json.dll
、MaterialDesignThemes.Wpf.dll
和MaterialDesignColors.dll
,则dlls
数组内容为
readonly string[] dlls = new string[] { "Newtonsoft.Json" , "MaterialDesignThemes.Wpf" , "MaterialDesignColors"};
最后重新生成项目,删除生成目录下的dll文件即可。
Costura.Fody可以把引用的库文件嵌入为资源,使用起来非常简单,直接安装Costura.Fody即可:
PM> Install-Package Costura.Fody
举一个简单例子:
PM> Install-Package Newtonsoft.Json
生成结果如下:
.NET Reactor是一款.NET代码加密混淆工具,同时具有扫描依赖,并嵌入程序集的功能。
具体使用步骤:
总的来说,上面三种方式都可以嵌入dll资源,生成单文件。Costura.Fody和.NET Reactor使用起来方便,改动最小。如果还有加密需求,那就推荐使用.NET Reactor。
版权声明:本文为「txfly」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.jianshu.com/p/72534a7e2f4a
标签:detail 功能 exe 加载 pyc gas ring reac obj
原文地址:https://www.cnblogs.com/lonelyxmas/p/12208816.html