最近写了一个小的WPF程序,发布的时候发现依赖着两三个20~30k的小dll的,感觉有点不爽,就想把它合并一下。以前在WinForm下用过微软的ILMerge合并程序集,不过记得它对WPF程序支持不大好。便在网上搜了一下,找到了一种资源嵌入的方式Combining multiple assemblies into a single EXE for a WPF application,园子里也有文章介绍这种方式:wpf dll和exe合并成一个新的exe

这种方式的原理并不复杂,不过感觉这种通用的方式应该可以通过工具来实现,每个程序都这么实现一把有点麻烦,便再继续搜了一下,在CodePlex上找到了一个叫LibZ Container的程序可以帮助我们快速实现这一过程,它是一个命令行工具,使用方式如下:

Libz inject-dll --assembly MyApplication.exe --include *.dll --move

这个工具还有许多其它的参数,具体的可以看看它的详细说明。 由于这种工具的原理是将DLL作为资源嵌入了主程序集中,并且LibZ打包的时候貌似还做了一个压缩的动作,理论上会影响启动速度的。不过需要合并程序集的一般都是些小程序,目前还没有看到什么大的影响。

另外,发现这种工具还蛮多的,当时找到的就有Costura.Fodynetz(需要FQ)IL-Repack,简单的试了两个,感觉侧重点有所不同,不过只是打包dll的话,效果基本上都差不多。

这种工具的基本原理是:

  1. 当CLR试图加载一个程序集但加载失败时,它会引发AppDomain.AssemblyResolve事件。

  2. 程序可以监听这个事件,并且在这个事件的处理函数中返回这个CLR试图加载的程序集,从而使程序得以继续正常运行。

  3. 工具引用到的DLL全部嵌入到EXE文件中。当程序在运行的过程中用到其中某个DLL的时候(此时由于CLR无法找到该DLL文件,导致AppDomain.AssemblyResolve事件被触发)再从EXE文件的嵌入资源中提取所需的DLL。

参考文章:

  • http://www.digitallycreated.net/Blog/61/combining-multiple-assemblies-into-a-single-exe-for-a-wpf-application
  • https://www.bbsmax.com/A/A7zgEgpo54/
  • https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/app-development/building-a-wpf-application-wpf

使用LibZ合并.Net程序集,支持WPF的更多相关文章

  1. CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本

    CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...

  2. .NET Framwork 之 源代码编译成托管代码托管代码合并成程序集

    我们都知道,C#程序需要在 .NET Framework 的环境中运行. 一.程序运行所需的三个关键 1.IL(中间语言):编译器编译源代码时生成的代码. 2. Framework类库(Framewo ...

  3. CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)

    事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0 ...

  4. [CLR via C#]1.2 将托管模块合并成程序集

    原文:[CLR via C#]1.2 将托管模块合并成程序集 1.CLR是不和托管模块一起工作的,CLR是和程序集一起工作的. 2. 程序集是一个或多个托管模块/资源文件的逻辑性分组.   3. 程序 ...

  5. vs2015网站发布时,设置页面合并后程序集的文件版本

    如何将web网站的页面合并成一个新的程序集发布,并设定文件版本? 这个问题我也纠结了很久,问了很多大牛,也没有找到解决方案 曾开了一贴,https://bbs.csdn.net/topics/3910 ...

  6. C# 通用验证类 支持 WPF,MVC,Winform

    验证方式,   通过继承 IDataErrorInfo接口 和 DataAnnotations 解释标记语言而实现, 为了能在WPF上通用,所了也要继承属性更改通知接口INotifyPropertyC ...

  7. Python3基础 set 自动将重复合并掉 不支持索引

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. Spider Studio 新版本 (20140108) - 优化设置菜单 / 生成程序集支持版本号

    本次更新包含两项改进: 1. 优化了设置菜单, 去掉了一些不必要的浏览器行为设置选项: 取而代之的是在脚本中由用户自行设置: public void Run() { Default.CaptureNe ...

  9. 在OpenResty中使用淘宝的concat进行css和js合并,同时支持GZIP静态压缩

    =======================================================================================cd /usr/local ...

随机推荐

  1. Isolate randomforest检测异常点的非监督方法

    由于异常数据的两个特征(少且不同: few and different) 异常数据只占很少量; 异常数据特征值和正常数据差别很大. iTree的构成过程如下: l  随机选择一个属性Attr: l  ...

  2. java基础38 正则表达式

    1.常用的正则表达式  预定义字符类:.  任何字符(与行结束符可能匹配也可能不匹配) \d  数字:[0-9] \D  非数字: [^0-9] \s  空白字符:[ \t\n\x0B\f\r] \S ...

  3. No.17 selenium学习之路之判断与等待

    一.三种等待方式 1.sleep 加载time库.time.sleep() 休眠单位以秒为单位 2.implicitly_wait() 等待页面完全加载完成(左上角转圈结束) 参数为等待时间,等待页面 ...

  4. 洛谷P3385负环

    传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...

  5. 网络协议之TCP

    前言 近年来,随着信息技术的不断发展,各行各业也掀起了信息化浪潮,为了留住用户和吸引用户,各个企业力求为用户提供更好的信息服务,这也导致WEB性能优化成为了一个热点.据分析,网站速度越快,用户的黏性. ...

  6. SQL行列转换的另一种方法

    create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)insert into tb values('张三' , '语文' , 74)inse ...

  7. Effective STL 学习笔记 Item 17: Swap Trick

    假设有若干对象存于一个 vector 中: class Widget; vector<Widget> vw; 后来由于某些原因,从该容器中删除了若干对象(参考erase-remove id ...

  8. HTML5练习2

    1.邮箱注册网页 主要代码: <!doctype html> <html> <meta charset="utf-8"> <title&g ...

  9. 反向投影(BackProjection)

    如果一幅图像的区域中显示的是一种结构纹理或者一个独特的物体,那么这个区域的直方图可以看作一个概率函数,他给的是某个像素属于该纹理或物体的概率. 所谓反向投影就是首先计算某一特征的直方图模型,然后使用模 ...

  10. 易普优APS签约本田汽车零部件八千代工业集团!

    2018年7月,易普优APS与八千代工业株式会社汽车零部件供应商正式签约,易普优APS在汽车零部件与整车行业的针对性解决方案的又一次得到客户高度认可与青睐! 日本八千代工业株式会社成立于1953年,总 ...