在上一篇文章《使用.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. 【前端】nodejs的ORM框架sequelize的工厂化

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/sequelize_factory.html 一.什么是sequelize nodejs的后台在操作数据库的时候,需 ...

  2. 实战DeviceIoControl 之三:制作磁盘镜像文件

    Q DOS命令DISKCOPY给我很深的印象,现在也有许多"克隆"软件,可以对磁盘进行全盘复制.我想,要制作磁盘镜像文件,DeviceIoControl应该很有用武之地吧? A 是 ...

  3. js 函数中的 return+匿名函数

    今天一个刚学js的朋友给了我一段代码问为什么方法不执行,代码如下: 代码如下: function makefunc(x) {  return function (){   return x;  } } ...

  4. es6学习笔记--let和const

    今天学习了es6中的let和const命令,借此整理一下笔记. let : let 和 var 的声明方式一样,但有 var 比不上的优点.下面用 var 和 let 的例子来加深对 let 的理解. ...

  5. order by group by

    order by 后 group by连用, mysql好像 >5.4不起作用 通过 explain 查看执行计划,可以看到没有 limit 的时候,少了一个 DERIVED 操作 估计是内部优 ...

  6. 【BZOJ1305】跳舞(网络流)

    [BZOJ1305]跳舞(网络流) 题面 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一 ...

  7. Tomcat 请求处理流程详解

    Overview Connector 启动以后会启动一组线程用于不同阶段的请求处理过程. Acceptor 线程组.用于接受新连接,并将新连接封装一下,选择一个 Poller 将新连接添加到 Poll ...

  8. mysql测试

    数据库效率测试: 1.创建索引: 数据量小(或者空表)的情况下创建索引: 有一定数据量情况下(100000条数据)创建索引: 在有一定数据量的情况下,数据库会为现有数据添加索引,此时,创建索引的工作量 ...

  9. react-redux状态管理思想

    最近一段一直在加班做项目,几乎每天都要加班到晚上9点,每周也只休息一天,一直没有时间把eact全家桶,再整体熟悉一遍.索性,就在最近的项目中,借鉴了react-redux的思想,维护状态和发布acti ...

  10. Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台之应用数据分析

    本节将引入完美的granafa仪表板,在上节的基础上,并提出自己的一些监控数据的总结和看法 你可以有一个类似于这个的Dashboard,会引入监控Zimbra协作 本节环境采用的是centos7系统, ...