编写 .NET 程序的时候,我们经常会在项目的输出目录下发现一大堆的文件。除了我们项目自己生成的程序集之外,还能找到这个项目所依赖的一大堆依赖程序集。有没有什么方法可以把这些依赖和我们的程序集合并到一起呢?
本文介绍四种将程序集和依赖打包合并到一起的方法,每一种方法都有其不同的原理和优缺点。我将介绍这些方法的原理并帮助你决定哪种方法最适合你想要使用的场景。
本文内容
四种方法
目前我已知的将 .NET 程序集与依赖合并到一起的方法有下面四种:
- 使用 .NET Core 3.0 自带的 PublishSingleFile 属性合并依赖
- 使用 Fody
- 使用 SourceYard 源代码包
- 使用 ILMerge(微软所写)或者 ILRepack(基于 Mono.Ceil)
- 其他方法
如果你还知道有其他的方法,欢迎评论指出,非常感谢!
上面的第五种方法我也会做一些介绍,要么是因为无法真正完成任务或者适用场景非常有限,要么是其原理我还不理解,因此只进行简单介绍。
使用 .NET Core 3.0 自带的 PublishSingleFile 属性合并依赖
.NET Core 3.0 自 Preview 5 开始,增加了发布成单一 exe 文件的功能。
在你的项目文件中增加下面的两行可以开启此功能:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
++ <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
++ <PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
</Project>
第一行 RuntimeIdentifier
一定需要指定,因为发布的单一文件是特定于架构的。这里,我们指定了 win10-x64,你也可以指定为其他的值。可以使用的值你可以在这篇文章中查询到:
第二行 PublishSingleFile
即开启发布时单一文件的功能。这样,你在发布你的程序的时候可以得到一个单一的可执行程序。发布一个 .NET Core 项目的方法是在命令行中输入:
dotnet publish
当然,如果你没有更改任何你的项目文件(没有增加上面的那两行),那么你在使用发布命令的时候就需要把这两个属性再增加上。因此完整的发布命令是下面这样的:
dotnet publish -r win10-x64 /p:PublishSingleFile=true
这里的 -r
就等同于在项目中指定 RuntimeIdentifier
持续。这里的 /p
是在项目中增加一个属性,而增加的属性名是 PublishSingleFile
,增加的属性值是 true
。
使用 .NET Core 3.0 这种自带的发布单一 exe 的方法会将你的程序的全部文件(包括所有依赖文件,包括非托管程序集,包括各种资源文件)全部打包到一个 exe 中。当运行这个 exe 的时候,会首先将所有这些文件生成到本地计算机中一个临时目录下。只有第一次运行这个 exe 的时候才会生成这个目录和其中的文件,之后的运行是不会再次生成的。
下面说一些 .NET Core 3.0 发布程序集的一点扩展——.NET Core 3.0 中对于发布程序集的三种处理方式可以放在一起使用:
- 裁剪程序集(Assembly Trimmer)
- 提前编译(Ahead-of-Time compilation,通过 crossgen)后面马上会说到 Microsoft.DotNet.ILCompiler
- 单一文件打包(Single File Bundling)本小节
关于 .NET Core 3.0 中发布仅一个 exe 的方法、原理和实践,可以参见林德熙的博客: