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

什么是CoreRT?

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

项目目标

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

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

基本信息

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

支持的平台

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

可以看到目前没有支持x86,所以想跑在x86架构的平台上还是老老实实的吧。。

项目状态

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

所以不推荐大家用在比较大型或商业项目上,会出很多问题。

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

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可设置的内容可以参考上面的平台支持

为对应的平台进行发布

最终你的项目文件可以像下面这样

执行发布命令

dotnet publish –c Release –r win-x64

dotnet publish –c Release –r linux-x64

我们就可以去具体的发布输出目录看到发布结果了

可以看到大小为3.7MB还是有优化的空间的,毕竟现在还不是正式版。

go引用fmt后的build大小差不多是1.9MB。

CoreRT目前存在的最大问题

CoreRT为什么不推荐大家现在使用?很大的一个问题就是现有所有用到反射的类型,都必须制定一个Mapping文件。异常麻烦。配置文件内容大概如下:

泛型也行也得一个个完全去指定,所以不推荐大家在太复杂的应用下使用。当然官方最终应该不会允许这个文件存在的。目前官方已经开了对应的issue用来讨论如何解决这个现状。

我们就再耐心等等吧。

使用CoreRT将.NET Core发布为Native应用程序的更多相关文章

  1. dotnet core 发布只带必要的依赖文件

    在使用 dotnet core 发布独立项目的时候,会带上大量依赖的库,但是通过微软提供的工具可以去掉一些在代码没有用到的库. 本文介绍的工具是 Microsoft.Packaging.Tools.T ...

  2. ASP.NET Core 发布至Linux生产环境 Ubuntu 系统

    ASP.NET Core 发布至Linux生产环境 Ubuntu 系统,之前跟大家讲解了 dotnet publish 发布,而没有将整个系统串起来. 今天就跟大家综合的讲一下ASP.NET Core ...

  3. Core 发布至Linux

    ASP.NET Core 发布至Linux生产环境 Ubuntu 系统 ASP.NET Core 发布至Linux生产环境 Ubuntu 系统,之前跟大家讲解了 dotnet publish 发布,而 ...

  4. asp.net core 发布到 docker 容器时文件体积过大及服务端口的配置疑问

    在 asp.net core 发布时,本人先后产生了3个疑问. 1.发布的程序为什么不能在docker容器中运行 当时在window开发环境中发布后,dotnet xxx.dll可以正常运行:但放入d ...

  5. .net core 发布后提示Start error

    纪录篇: 发布Core版本的项目后一直提示error,通过网络查询资料后确认梳理问题的逻辑   1.验证环境是否支持,开发环境及server环境        参考:https://docs.micr ...

  6. ASP.NET Core 发布

    ASP.NET Core 发布,asp.netcore发布 第一步:运行 dotnet restore 命令,以还原项目中指定的依赖项 dotnet restore 第二步:使用 dotnet bui ...

  7. AspNet Core 发布到Linux系统和发布IIS 注意项

    AspNet Core 发布到Linux系统和发布IIS 注意项 1.发布时需要注意的 2.Windows Server 2012 api-ms-win-crt-runtime-l1-1-0.dll ...

  8. ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作

    ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程. 1.创建项目 选择“文件” > “新建” > “项目”. 在“添加 ...

  9. 使用 Visual Studio 部署 .NET Core 应用 ——ASP.NET Core 发布的具体操作

    ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程. 1.创建项目 选择“文件” > “新建” > “项目”. 在“添加 ...

随机推荐

  1. TableLayoutPanel居中和单元格内元素居中

    在后台程序新建一个TableLayoutPanel 添加到form中,默认显示在左上角,想了很多让它居中的办法,在网上找了不少 最好的是: winform要设置控件的位置有3种: 1.控件的ancho ...

  2. Django使用模板后无法找到静态资源文件

    Django使用模板后无法找到静态资源文件 环境配置 Django版本1.11 python版本3.6.2 前言 在编写Django网站的时候,在涉及模板方面,一些简单的例子都没有问题,但这些例子都有 ...

  3. 阿里云服务器部署笔记一(python3、Flask、uWSGI、Nginx)

    一.重置密码,并重启服务器 二.安全组配置>配置规则>添加安全组规则(为了能在本地ssh到实例) 配置如下: 此配置为允许任意公网IP登陆实例,注意windows与Linux系统端口范围不 ...

  4. js基本类型与引用类型,浅拷贝和深拷贝

    1. 基本类型: string,number,boolean,null,undefined 2. 引用类型: Function,Array,Object 基本类型:存放在栈内存中的简单数据段,数据大小 ...

  5. 【转载】Ubuntu Android开发环境搭配

    Ubuntu Android开发环境搭配     安装Ubuntu Android应用程序开发环境需要如下几个软件 Java开发包:JDK 1.5/1.6 开发集成环境(IDE): Eclipse 3 ...

  6. hi3531的时钟系统

    时钟管理模块对芯片时钟输入.时钟生成和控制进行统一的管理,包括: 时钟管理模块有以下两部分输入:

  7. 摘抄--全面理解面向对象的 JavaScript

    全面理解面向对象的 JavaScript JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或 ...

  8. hdu5820 Lights

    主席树 但是能够想到题解的做法很难 #include <stdio.h> #include <string.h> #include <vector> #includ ...

  9. Ubuntu 14.04 鼠标消失解决方案

    Ubuntu 14.04 鼠标消失解决方案: 进入文字命令行模式,输入startx, 返回图像模式.

  10. 【Elasticsearch全文搜索引擎实战】之Kibana搭建

    1. Kibana介绍 Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据.使用Kibana,可以通过各种图表进行高 ...