▪ 前言

在 VS 开发过程中我们需要不断的编译软件并进行测试,同时 VS 会自动在项目跟目录的 \bin\Debug 文件夹里生成一系列文件(包括程序执行的主 exe 文件)。

对于简单 WPF 程序,我们通常可以直接拷贝 [Project Sub]\bin\Debug 下程序主 exe 文件就可以到其他机子使用了,当然前提是机子要已经装了对应的 .Net Formework 版本库

但是有时候我们会在项目引入其他第三方库(非 .Net 框架内置的库)并在代码中使用,例如:处理 JSON 数据的 Newtonsoft.Json 库等。然后编译项目后,你会发现 [Project Sub]\bin\Debug 文件下会多出两个文件:Newtonsoft.Json.dllNewtonsoft.Json.xml。而如果你现在将程序主 exe 文件拷贝到其他机子上,你会发现其无法正常运行了。原因很简单,因为缺少 Newtonsoft.Json.dll

当然你可以将程序主 exe 文件和这些第三方的 dll 一同拷贝过去,也可以使用其他工具将第三方库打包进程序主 exe 文件,下面介绍打包工具 LibZ

▪ LibZ

  1. 下载软件
https://libz.codeplex.com/releases/view/121324

下载 libz-1.1.0.2-tool 到本地并解压到 D:\libz

  1. 在 cmd 命令模式下进入到 [Project Sub]\bin\Debug 目录并执行下面代码:
D:\libz\libz.exe inject-dll --assembly MyApplication.exe --include *.dll --move

MyApplication.exe 应用程序名称,需要修改你自己的应用程序名称

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

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

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