在使用WPF写一些小工具时,往往需要将多个DLL文件嵌入到EXE文件里,生成单文件。这里介绍三种方案:

  • 把DLL文件作为嵌入资源
  • 使用Costura.Fody
  • 使用.NET Reactor。

一、把DLL文件转换为嵌入资源

第一步,在项目中新建Resources文件夹,把需要的dll文件拷贝到该目录中(可以是多个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.dllMaterialDesignThemes.Wpf.dllMaterialDesignColors.dll,则dlls数组内容为

readonly string[] dlls = new string[] { "Newtonsoft.Json" , "MaterialDesignThemes.Wpf" , "MaterialDesignColors"};

最后重新生成项目,删除生成目录下的dll文件即可。

二、使用Costura.Fody

Costura.Fody可以把引用的库文件嵌入为资源,使用起来非常简单,直接安装Costura.Fody即可:

PM> Install-Package Costura.Fody

举一个简单例子:

  1. 新建一个WPF项目,添加Newtonsoft.Json:PM> Install-Package Newtonsoft.Json
  2. 安装Costura.Fody
  3. 生成项目

生成结果如下:

Costura.Fody生成结果

Costura.Fody链接: https://github.com/Fody/Costura

三、使用 .NET Reactor

.NET Reactor是一款.NET代码加密混淆工具,同时具有扫描依赖,并嵌入程序集的功能。
具体使用步骤:

  1. 打开WPF项目生成的exe文件
  2. 点击扫描依赖项按钮;
  3. 勾选嵌入所有程序集;
  4. 点击保护即可。

    使用流程

    生成结果如下:

    生成结果

总的来说,上面三种方式都可以嵌入dll资源,生成单文件。Costura.Fody和.NET Reactor使用起来方便,改动最小。如果还有加密需求,那就推荐使用.NET Reactor。

版权声明:本文为「txfly」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.jianshu.com/p/72534a7e2f4a

三种方法,让WPF项目生成单文件相关推荐

  1. 为什么安监控需要公网ip_三种方法告诉你项目超过255个摄像机怎么设置IP?

    原标题:三种方法告诉你项目超过255个摄像机怎么设置IP? 我们做弱电的,与ip地址接触最多,无论是弱电的哪方面,都需要跟ip地址打交道,通常我们也会经常听到公网.内网?那什么是公网ip地址呢?什么是 ...

  2. python实时监控文件目录_教你三种方法,用 Python实时监控文件

    原标题:教你三种方法,用 Python实时监控文件 在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决 ...

  3. 基于Python实现中文文本关键词抽取的三种方法 课程报告+项目源码及数据

    资源下载地址:https://download.csdn.net/download/sheziqiong/85737856 资源下载地址:https://download.csdn.net/downl ...

  4. PDF如何去除水印?三种方法教你如何去除PDF文件水印

    PDF水印是PDF文档中常见的一种标识符号,用于标识文件的版权或者来源等信息.如果您想去除PDF文档中的水印,可以尝试以下方法: 1.使用Adobe Acrobat Pro 这是全世界最大的软件公司A ...

  5. [转][小结][三种方法]实现WPF不规则窗体

    实现WPF不规则窗体的三种常用的方法如下: 1.使用Blend等工具绘制一个不规则xaml,然后作为窗体的背景.这个可以参考xiaowei0705的这篇博文:WPF制作不规则的窗体 . 2.给wind ...

  6. vbs执行ctrl+空格_VBS中解决路径带空格的三种方法

    vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: Set wshell=CreateObject(&qu ...

  7. android系统通过图片绝对路径获取URI的三种方法

    老马的技术博客 android系统通过图片绝对路径获取URI的三种方法 最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1. ...

  8. 在MATLAB中生成矩阵的三种方法

    在MATLAB中生成矩阵的三种方法 1. 直接输入法 2. 外部文件读入法 3.特殊矩阵函数生成法 1. 直接输入法 (1)矩阵所有元素必须在[]内 (2)矩阵中同行元素以逗号','或空格分隔 (3) ...

  9. python如何实现下载文件_python实现下载文件的三种方法

    python实现下载文件的三种方法 Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件. ...

  10. github下载加速三种方法

    第一种方法: 在github.com后面加  .cnpmjs.org 例如我现在要用git下载gorm项目  https://github.com/go-gorm/gorm 想要加速则使用指令  gi ...

最新文章

  1. 1400小时开源语音数据集,你想要都在这儿
  2. python在线教学-老男孩Python在线教学|学好Python发展如何?
  3. spring使用JUnit测试,@Autowired无法注入原因
  4. python chm制作_生成chm文档的方法
  5. Hibernate框架--学习笔记(中):一对多配置、多对多配置
  6. 毕设开发总结-3D游戏框架及网络对战游戏的开发(1)
  7. [Linux基础环境/软件]Linux下安装resin web服务器(涉及gcc、jdk环境部署)
  8. .png图片 阴影效果(fliter:drop-shadow属性)案例
  9. 给超链接A添加按钮样式
  10. IDEA 访问Maven私服与上传组件
  11. 如何判断浏览器/标签是否有效[重复]
  12. 详解电脑蓝屏怎么回事
  13. 服务器上装的hadoop系统,在Ubuntu Server 18.04.1中安装Hadoop系统环境
  14. CWMP协议(TR069协议)学习
  15. Linux下载神器XDM
  16. mysql和redis常见面试题_redis相关面试题
  17. 电脑死机,Word忘了保存怎么恢复?(编辑器是WPS)
  18. Linux下的搜狗拼音输入法-fcitx sougopinyin
  19. Android——App内文件分享功能
  20. java对焦_Android camera摄像头对焦,zoom的通知事件回调,告诉java应用层已经对焦完成...

热门文章

  1. sqli-labs(46-49)
  2. 听课记录高中计算机,高中听课记录
  3. 推荐PC端一款非常好用的解压缩软件
  4. 算法Big O Notation
  5. 产品经理的工作及职责
  6. 宁宛 机器人_.001 忠犬机器人
  7. android防止程序休眠,android 设置 永不休眠
  8. c语言编程学生活动安排表,C语言作业安排表(18学时-周学时2...).doc
  9. 择一城终老,遇一人白首
  10. 手游服务器微信互通,使命召唤手游QQ和微信可以一起玩吗