Default Executables 默认可执行文件
在 dotnet build 或 dotnet publish 期间,将创建一个与你使用的 SDK 的环境和平台相匹配的可执行文件。 和其他本机可执行文件一样,可以使用这些可执行文件执行相同操作,例如:
可以双击可执行文件。
可以直接从命令提示符启用应用程序,如 Windows 上的 myapp.exe,以及 Linux 和 macOS 上的 ./myapp。
下面是一个基于.NET Core 2.2的项目:
当我Build该项目之后,在bin/Debug/netcoreapp2.2目录下有这些文件:
这里没有.exe文件。
下面是一个.NET Core 3.0的项目:
当我build项目后,bin/Debug/netcoreapp3.0目录下有这些文件:
值得注意的就是,这里有一个exe文件,点击它可以直接运行该项目。
而且这个exe文件的大小也很小,这是因为它依赖于.NET Core运行时,它所需要的依赖项在我电脑上是全局可用的。
还有另外一个地方也值得注意,项目所有的依赖也都复制到了这个输出的文件夹里。
Single-file Executables 单文件可执行文件
这种部署方式很方便,、。dotnet publish 命令支持将应用打包为特定于平台的单文件可执行文件。 该可执行文件是自解压缩文件,包含运行应用所需的所有依赖项(包括本机依赖项)。 首次运行应用时,应用程序将根据应用名称和生成标识符自解压缩到一个目录中。 再次运行应用程序时,启动速度将变快。 除非使用了新版本,否则应用程序无需再次进行自解压缩。
下面针对这个.NET Core 3.0的项目,我们修改一下项目属性,来实现Single-file Executables部署:
build的话不会起作用,这个功能仅支持发布(publish):
看一下输出文件夹:
实际上这里只有一个exe文件,没有其它dll文件,而且这个exe文件很大,因为这里面包含了它需要的所有依赖。
Assembly linking 程序集链接
目前这个exe有点大,.NET core 3.0 SDK 随附了一种工具,可以通过分析 IL 并剪裁未使用的程序集来减小应用的大小。
自包含应用包括运行代码所需的所有内容,而无需在主计算机上安装 .NET。 但是,很多时候应用只需要一小部分框架即可运行,并且可以删除其他未使用的库。
.NET Core 现在包含一个设置,将使用 IL 链接器工具扫描应用的 IL。 此工具将检测哪些代码是必需的,然后剪裁未使用的库。 此工具可以显著减少某些应用的部署大小。
要启用此工具,请使用项目中的 <PublishTrimmed> 设置并发布自包含应用:
再次发布后:
可以看到exe文件的大小减小了很多,这是因为这里只包含了这个项目真正用到的依赖。
但是启用这个特性的时候一定要注意,如果项目使用到了反射或相关动态功能(例如 ASP.NET Core 和 WPF),那么通常会在剪裁时损坏。 发生此损坏是因为链接器不知道此动态行为,并且不能确定反射需要哪些框架类型。 可配置 IL 链接器工具以发现这种情况。
最重要的是,剪裁后务必对应用进行测试。
ReadyToRun 镜像
可以通过将应用程序集编译为 ReadyToRun (R2R) 格式来改进.NET Core 应用程序的启动时间。
这里首先把注释掉<PublishTrimmed>,然后添加<PublishReadyToRun>:
发布:
发布后会得到一个稍微大一点的exe文件,这是因为里面包含了原生代码和IL(中间语言)版的程序。
更详细内容请查看原文链接。