使用LibZ合并.Net程序集

最近写了一个小的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打包的时候貌似还做了一个压缩的动作,理论上会影响启动速度的。不过需要合并程序集的一般都是些小程序,目前还没有看到什么大的影响。

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

需要注意的是:当主程序在XAML中依赖于其它DLL提供的资源文件的时候(主题样式等资源字典),由于对程序集的依赖是作为BAML文件嵌入到了程序中,要合并这种带资源的程序集需要修改这些BAML文件,而这是一件比较麻烦的事情,目前还没有见过那个工具做到了这一点。因此,资源的DLL是不能参与程序集合并的,资源文件的DLL的依赖性是无法去掉的。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。