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 应用程序的启动时间。 

R2R 是一种预先 (AOT) 编译形式。 R2R 二进制文件通过减少应用程序加载时实时 (JIT) 编译器需要执行的工作量来改进启动性能。 二进制文件包含与
 JIT 将生成的内容类似的本机代码。 但是,R2R 二进制文件更大,因为它们包含中间语言 (IL) 代码(某些情况下仍需要此代码)和相同代码的本机版本。 
仅当发布面向特定运行时环境 (RID)(如 Linux x64 或 Windows x64)的自包含应用时 R2R 才可用。 

 

这里首先把注释掉<PublishTrimmed>,然后添加<PublishReadyToRun>: 

 

发布: 

发布后会得到一个稍微大一点的exe文件,这是因为里面包含了原生代码和IL(中间语言)版的程序。