CoreRT
使用CoreRT将.NET Core发布为Native应用程序
在上一篇文章《使用.NET Core快速开发一个较正规的命令行应用程序》中我们看到了使用自包含方式发布的.NET Core应用中包含了216个文件。我就写一个cat命令用得着这么动真格。。。这写出来的命令行还有人用吗?今天我们就来介绍一下MS的另一个开源项目CoreRT。用来解决这个棘手的问题。
回到目录
什么是CoreRT?
CoreRT 是MS一个长期开源项目,它早在一年前就已经建立了,持续到今。
项目目标
将.NET Core托管(CLR)应用程序编译为本地(特地平台)的单一可执行文件。
说白了就是将.NET Core编译为机器码(也可以是其他东西,如C++代码),而不再有之前的运行时,将.NET变为真正的“静态编译形”语言。
基本信息
项目地址:https://github.com/dotnet/corert
支持的平台
Windows x64
MacOS x64
Linux x64/ARM
CppCodeGen
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可设置的内容可以参考上面的平台支持
为对应的平台进行发布
最终你的项目文件可以像下面这样
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用来讨论如何解决这个现状。
我们就再耐心等等吧。
CoreRT的更多相关文章
- .NET Core单文件发布静态编译AOT CoreRT
.NET Core单文件发布静态编译AOT CoreRT,将.NET Core应用打包成一个可执行文件并包含运行时. 支持Windows, MacOS and Linux x64 w/ RyuJIT ...
- 使用CoreRT将.NET Core发布为Native应用程序
在上一篇文章<使用.NET Core快速开发一个较正规的命令行应用程序>中我们看到了使用自包含方式发布的.NET Core应用中包含了216个文件.我就写一个cat命令用得着这么动真格.. ...
- coreRT 和 Native 编译netcore AOT程序
AOT是预编译成本地程序,避免JIT动态编译存在的性能问题. netcore一个吸引人的项目,就是基于coreRt 运行时的本地编译技术,下面我来替大家尝试一下它究竟表现如何. <Project ...
- [转帖].NET Core单文件发布静态编译AOT CoreRT
.NET Core单文件发布静态编译AOT CoreRT https://www.cnblogs.com/linezero/p/CoreRT.htm .NET Core单文件发布静态编译AOT Cor ...
- dotnet core 使用 CoreRT 将程序编译为 Native 程序
现在微软有一个开源项目 CoreRT 能通过将托管的 .NET Core 编译为单个无依赖的 Native 程序 这个项目现在还没发布,但是能尝试使用,可以带来很多的性能提升 使用 CoreRT 发布 ...
- JSP 标准标签库(JSTL)
JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签, ...
- .NET Core全面扫盲贴
标签: .NETCore Asp.NETCore 1. 前言 2. .NET Core 简介 2.1 .NET Core是什么 2.2 .NET Core的组成 2.3 .NET Core的特性 2. ...
- 简析 .NET Core 构成体系
简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...
- JSTL配置
1.下载jakarta-taglibs-standard-1.1.2.zip(在Weblogic中必须下载1.0版http://jakarta.apache.org/site/downloads/do ...
随机推荐
- 高性能MySQL之【第十六章MySQL用户工具】学习记录
接口工具: Msql Workbench http://www.mysql.com/products/workbench SQLyog http://www.webyog.c ...
- tyvj 1203 机器分配
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 总公司拥有高效生产设备M台,准备分给下属的N个公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何 ...
- saltstack其他运行模式
除了常规的运行模式外,salt还有几种运行模式 salt-call --local可以直接在minion上自执行,多用于本机自测试,此方式几乎不用,知道即可 [root@linux-node2 ~]# ...
- Poco 编译mysql
POCO mysql需要自己添加connecter的header和lib MySQL Client: For the MySQL connector, the MySQL client librari ...
- 转载:数据库应用开发工具Toad使用笔记
由于网上TOAD中文教程很少,在网上摘抄了此文章便于学习,感谢原创者. TOAD使用笔记 1.把鼠标停在sql所在行,然后ctrl+Enter直接执行当前sql. 2.解决Toad对中文显示乱码问题( ...
- [cf2015ICLFinalsDiv1J]Ceizenpok’s formula
题意:$C_n^m\% k$ 解题关键:扩展lucas+中国剩余定理裸题 #include<algorithm> #include<iostream> #include< ...
- 转:使用 VisualVM 进行性能分析及调优
使用 VisualVM 进行性能分析及调优 VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括 ...
- 《SpringBoot揭秘 快速构建微服务体系》读后感(一)
SpringIOC IOC有两种方式:一种是DI,另一种是DL,即Dependency Lookup(依赖查找).前者是当前软件实体被动接受其依赖的其他组件被IoC容器注入,而后者则是当前软件实体主动 ...
- python http通信实现
http协议通信需要httpServer和httpClient. 在python中 -- httpServer的实现类是server.py文件,要跟实现tcp,udp Server的文件sockets ...
- eclipse里的Maven插件安装
插件安装 打开Eclipse的Help->Install New Software,如下图所示: 2. 选择“Add..”按钮,又会弹出如下对话框: 这个对话框就是用于添加一个插件地址的.在“N ...