.NET Core 3.x 发布的单文件应用是自解压程序, 解压路径貌似是通过 System.IO.Path.GetTempPath()
来确定的:
%TEMP%\.net\
/var/folders/s8/q4c00lhx3k384hngtv9pmwv40000gn/T/.net/
/var/tmp/.net/
.NET Core 3.x 发布的单文件应用偶尔会出现无法运行的错误, 需要删除上面目录中对应的 app 目录, 再运行就可以了;
.NET 5.0 发布的自单文件应用可以直接运行,不需要再解压;
true
时,需要对发布后的文件测试;.NET Core 3.x 发布的单文件应用文件最小大概是 30 兆左右, 和 Go 发布的 10 兆左右的单文件应用相比确实大一些, 但是如果在发布之后用 7zip 压缩一下, 也是 10 多兆, 和 Go 发布的单文件应用不相上下。
.NET 5.0 发布的单文件应用大小也差不多是这样子的。
测试环境的操作系统为 Ubuntu 20.04.1 LTS , 安装 .NET 5.0.100-preview.8.20417.9 , 以一个控制台程序为例, 发布命令为
dotnet publish -r osx-x64 -c Release \
-p:PublishSingleFile=true \
-p:PublishTrimmed=true \
-p:SelfContained=true \
-p:PublishReadyToRun=false \
-p:DebugType=None -o ./bin/Publish/osx-x64
经过测试, 使用 .NET 5.0 Preview 8 发布的单文件应用, 如果应用稍微复杂一些, 只有在目标是 Linux 系统时, 发布结果只有一个可执行文件, Windows 和 macOS 都会额外带上几个小尾巴。
当输出目标为 Linux 系统时, 发布的结果为:
当输出目标为 Windows 系统时, 发布的结果可能为:
而当输出目标为 macOS 系统时, 发布的结果可能为: