三种方法,让WPF项目生成单文件
在使用WPF写一些小工具时,往往需要将多个DLL文件嵌入到EXE文件里,生成单文件。这里介绍三种方案:
- 把DLL文件作为嵌入资源
- 使用Costura.Fody
- 使用.NET Reactor。
一、把DLL文件转换为嵌入资源
第一步,在项目中新建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可以把引用的库文件嵌入为资源,使用起来非常简单,直接安装Costura.Fody即可:
PM> Install-Package Costura.Fody
举一个简单例子:
- 新建一个WPF项目,添加Newtonsoft.Json:
PM> Install-Package Newtonsoft.Json
- 安装Costura.Fody
- 生成项目
生成结果如下:
Costura.Fody链接: https://github.com/Fody/Costura
三、使用 .NET Reactor
.NET Reactor是一款.NET代码加密混淆工具,同时具有扫描依赖,并嵌入程序集的功能。
具体使用步骤:
- 打开WPF项目生成的exe文件
- 点击扫描依赖项按钮;
- 勾选嵌入所有程序集;
- 点击保护即可。
生成结果如下:
总的来说,上面三种方式都可以嵌入dll资源,生成单文件。Costura.Fody和.NET Reactor使用起来方便,改动最小。如果还有加密需求,那就推荐使用.NET Reactor。
版权声明:本文为「txfly」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.jianshu.com/p/72534a7e2f4a
三种方法,让WPF项目生成单文件相关推荐
- 为什么安监控需要公网ip_三种方法告诉你项目超过255个摄像机怎么设置IP?
原标题:三种方法告诉你项目超过255个摄像机怎么设置IP? 我们做弱电的,与ip地址接触最多,无论是弱电的哪方面,都需要跟ip地址打交道,通常我们也会经常听到公网.内网?那什么是公网ip地址呢?什么是 ...
- python实时监控文件目录_教你三种方法,用 Python实时监控文件
原标题:教你三种方法,用 Python实时监控文件 在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决 ...
- 基于Python实现中文文本关键词抽取的三种方法 课程报告+项目源码及数据
资源下载地址:https://download.csdn.net/download/sheziqiong/85737856 资源下载地址:https://download.csdn.net/downl ...
- PDF如何去除水印?三种方法教你如何去除PDF文件水印
PDF水印是PDF文档中常见的一种标识符号,用于标识文件的版权或者来源等信息.如果您想去除PDF文档中的水印,可以尝试以下方法: 1.使用Adobe Acrobat Pro 这是全世界最大的软件公司A ...
- [转][小结][三种方法]实现WPF不规则窗体
实现WPF不规则窗体的三种常用的方法如下: 1.使用Blend等工具绘制一个不规则xaml,然后作为窗体的背景.这个可以参考xiaowei0705的这篇博文:WPF制作不规则的窗体 . 2.给wind ...
- vbs执行ctrl+空格_VBS中解决路径带空格的三种方法
vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: Set wshell=CreateObject(&qu ...
- android系统通过图片绝对路径获取URI的三种方法
老马的技术博客 android系统通过图片绝对路径获取URI的三种方法 最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1. ...
- 在MATLAB中生成矩阵的三种方法
在MATLAB中生成矩阵的三种方法 1. 直接输入法 2. 外部文件读入法 3.特殊矩阵函数生成法 1. 直接输入法 (1)矩阵所有元素必须在[]内 (2)矩阵中同行元素以逗号','或空格分隔 (3) ...
- python如何实现下载文件_python实现下载文件的三种方法
python实现下载文件的三种方法 Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件. ...
- github下载加速三种方法
第一种方法: 在github.com后面加 .cnpmjs.org 例如我现在要用git下载gorm项目 https://github.com/go-gorm/gorm 想要加速则使用指令 gi ...
最新文章
- 1400小时开源语音数据集,你想要都在这儿
- python在线教学-老男孩Python在线教学|学好Python发展如何?
- spring使用JUnit测试,@Autowired无法注入原因
- python chm制作_生成chm文档的方法
- Hibernate框架--学习笔记(中):一对多配置、多对多配置
- 毕设开发总结-3D游戏框架及网络对战游戏的开发(1)
- [Linux基础环境/软件]Linux下安装resin web服务器(涉及gcc、jdk环境部署)
- .png图片 阴影效果(fliter:drop-shadow属性)案例
- 给超链接A添加按钮样式
- IDEA 访问Maven私服与上传组件
- 如何判断浏览器/标签是否有效[重复]
- 详解电脑蓝屏怎么回事
- 服务器上装的hadoop系统,在Ubuntu Server 18.04.1中安装Hadoop系统环境
- CWMP协议(TR069协议)学习
- Linux下载神器XDM
- mysql和redis常见面试题_redis相关面试题
- 电脑死机,Word忘了保存怎么恢复?(编辑器是WPS)
- Linux下的搜狗拼音输入法-fcitx sougopinyin
- Android——App内文件分享功能
- java对焦_Android camera摄像头对焦,zoom的通知事件回调,告诉java应用层已经对焦完成...