使用CoreRT将.NET Core发布为Native应用程序

在上一篇文章《使用.NET Core快速开发一个较正规的命令行应用程序》中咱们看到了使用自包含方式发布的.NET Core应用中包含了216个文件。我就写一个cat命令用得着这么动真格。。。这写出来的命令行还有人用吗?今天咱们就来介绍一下MS的另外一个开源项目CoreRT。用来解决这个棘手的问题。html

什么是CoreRT?

CoreRT 是MS一个长期开源项目,它早在一年前就已经创建了,持续到今。linux

项目目标

将.NET Core托管(CLR)应用程序编译为本地(特意平台)的单一可执行文件。git

说白了就是将.NET Core编译为机器码(也能够是其余东西,如C++代码),而再也不有以前的运行时,将.NET变为真正的“静态编译形”语言。github

基本信息

项目地址:https://github.com/dotnet/corertjson

支持的平台小程序

  1. Windows x64
  2. MacOS x64
  3. Linux x64/ARM
  4. CppCodeGen
  5. WebAssembly(Blazor目前仍是基于Mono的,若是CoreRT成型,不出意外会切换到CoreRT)

能够看到目前没有支持x86,因此想跑在x86架构的平台上仍是老老实实的吧。。windows

项目状态

目前项目版本是:alpha,也就是说非正式版,切还离得比较远。api

因此不推荐你们用在比较大型或商业项目上,会出不少问题。架构

但写个小程序,小工具仍是没什么太大问题的。app

Native的优点是什么?

Native的优点我一说到就激动,期待了好久。从早期Core beta2还有这个功能,到后面被搁置(来不及发布)经历了指望与失落。。克制住情绪,下面咱们来理性分析一下Native的好处。

更少的发布文件

Native后发布文件明显减小,通常状况下咱们的.NET应用,每引用一个packages就至少增长一个文件(*.dll)Native会将这些dll都打包在一块儿。这样极大方便了发布和部署。

启动速度更快

咱们都知道托管语言(.NET、Java)第一次执行(不只仅是启动,全部的方法、语句第一次执行都同样)都很慢(《在.net中为何第一次执行会慢?》),这是托管语言的优点也一样是劣势。

Native后就不存在虚拟机技术(CLR、JVM)也就没有的即时编译这个动做了。获得的好处就是第一次执行跟第二次执行是同样的。

更少的内存资源

Native后会进一步减小内存的使用,不须要加载一些核心“框架”(JIT)等。

Native的缺点?

Native并非万能的,也存在缺点。但我以为总体上利大于弊。

更强的针对性

Native后就基本不能跨平台了(这边的跨平台是指一次发布处处运行,并非指程序不能跨平台)

也就是说,若是你要运行在windows上须要单独为windows进行一次发布,运行在MacOS上也须要单独进行一次发布,运行在Linux上一样也须要单独进行一次发布(固然还包括x86\x64\ARM这样的变动,都须要从新发布)

一样JIT也没法为代码提供执行编译优化,能够参考以前文章中,关于CPU个数的代码优化。

使用CoreRT发布你的第一个Native应用程序

添加Packages

首先,由于这个项目尚未正式发布,因此你须要添加dotnet团队的每日构建nuget源,地址为:https://dotnet.myget.org/F/dotnet-core/api/v3/index.json

而后安装packages:Microsoft.DotNet.ILCompiler

或者你能够在你的项目路径下执行下面的命令:

dotnet add package Microsoft.DotNet.ILCompiler -s https://dotnet.myget.org/F/dotnet-core/api/v3/index.json –v 1.0.0-alpha-*

设置RuntimeIdentifiers

RuntimeIdentifiers可设置的内容能够参考上面的平台支持

为对应的平台进行发布

最终你的项目文件能够像下面这样

image

执行发布命令

dotnet publish –c Release –r win-x64

dotnet publish –c Release –r linux-x64

image

咱们就能够去具体的发布输出目录看到发布结果了

image

能够看到大小为3.7MB仍是有优化的空间的,毕竟如今还不是正式版。

go引用fmt后的build大小差很少是1.9MB。

CoreRT目前存在的最大问题

CoreRT为何不推荐你们如今使用?很大的一个问题就是现有全部用到反射的类型,都必须制定一个Mapping文件。异常麻烦。配置文件内容大概以下:

image

泛型也行也得一个个彻底去指定,因此不推荐你们在太复杂的应用下使用。固然官方最终应该不会容许这个文件存在的。目前官方已经开了对应的issue用来讨论如何解决这个现状。

咱们就再耐心等等吧。

相关文章
相关标签/搜索