当前位置: 首页 > 编程日记 > 正文

简析 .NET Core 构成体系

  • 简析 .NET Core 构成体系
    • Roslyn 编译器
    • RyuJIT 编译器
    • CoreCLR & CoreRT
    • CoreFX(.NET Core Libraries)
    • .NET Core 代码开发、部署、运行过程
    • 总结

前文介绍了.NET Core 在整个.NET 平台所处的地位,以及与.NET Framework的关系(原文链接),本文将详细介绍.NET Core 框架的构成和各模块主要功能,以及如何实现跨平台。

构成体系

上图描述了 .NET Core的系统构成,最上层是应用层,是开发基于UI应用的框架集,包括了ASP.NET Core(用于创建web app),和 UWP(用于创建Windows10 app)。

中间层是公共库(CoreFX),实现了.NET Standard Library ,囊括了常用系统级操作例如(文件、网络等)。

在CoreFx下是运行时环境,.NET Core 包含了两种运行时(CoreCLR、CoreRT),CoreCLR是一种基于即时编译程序(Just in time compiler,JIT)的运行时,它使用了跨平台开源的编译器RyuJIT,而CoreRT是使用提前编译器(Ahead of time compiler,AOT)的运行时,它既可以使用RyuJIT来实现AOT编译也可以使用其他的AOT编译器。由于AOT提前编译IL成了机器码,在移动设备上也具有更好的启动速度和节能性。

最后还要提到一个开源的跨平台源代码编译器Roslyn,它有别于刚才两个编译器,JIT和AOT编译器主要用于将IL编译成本机机器码,而Roslyn是将C# 或 VB.NET 代码编译成程序中间语言(intermediate language,IL)。

Roslyn 编译器

Roslyn编译器用于将C#或VB.NET代码编译为程序集(assembly),它的编译过程是一个管道式的处理过程一共包含4个步骤,具体过程见下图。

compiler pipeline

A. Parser(解析)

根据语法对源代码进行解析。

B. Declaration (声明)

为代码生成元数据(metadata),元数据是一个数据表的集合,描述了在当前代码中定义的数据类型和成员,同时也描述了引用的类型及成员。

C. Bind(绑定)

将生成的IL代码与描述它的元数据绑定在一起,生成托管模块(managed module)。

D. Emit(生成)

将一个或多个托管模块合并生成程序集(assembly)。

RyuJIT 编译器

在程序运行中需要执行某一个方法,首先需要将已经编译好的IL转换本机的机器码,而这个任务就交给了RyuJIT。它是新一代JIT编译器,第一次实现了AMD64的架构,RyuJIT能够比JIT64(上一代编译器)更快地生成代码,以提高程序运行效率(测试详情链接)。

CoreCLR & CoreRT

CoreCLR 和 CoreRT 都是.NET Core的运行时(Runtime),
它们提供了与.NET Framework CLR 类似的核心功能(内存管理、程序集加载、安全性、异常、线程管理等),可由面向于运行时的所有语言使用。

CoreRT 和 CoreCLR 不同的是,CoreRT 提供了一套
AOT 的机制,可以将.NET Core程序编译成原生代码,不依赖 .NET 运行时而运行在宿主机器上。除此之外两个运行时大部分功能代码是共享的,比如GC。AOT的优化带来不少好处:

  • 编译后生成一个单文件,包含所有的依赖,包括 CoreRT,无需安装Framework

  • 启动时是机器码,不需要生成机器码,也不要加载JIT编译器

  • 可以使用其他优化编译器,包括 LLILC ,IL to CPP

CoreRT有两个方式生成机器码,第一个使用是直接编译IL成机器码,默认情况下,RyuJIT 作为一个 AOT 编译器将IL编译成机器码,另一个方式是将C#代码编译成C++代码,然后调用对应平台的C++编译器优化编译成机器码。

使用 RyuJIT 编译成机器码

dotnet restore
dotnet build --native --ilcpath <repo_root>\bin
\Product\Windows_NT.x64.Debug\packaging\publish1

编译生成 C++ 代码

dotnet restore
dotnet build --native --cpp --ilcpath <repo_root>\bin\Product\Windows_NT.x64.Debug\packaging\
publish1 --cppcompilerflags /MTd

CoreRT也有不足之处,它需要为不同平台编译一次;但凡事有但是,它允许工程师可以不发布到不想支持的平台(比如某游戏仅支持桌面,不支持手机)。

注:这两个命名在.NET Core RC2 版本中均无法使用,按照官方说法是在当前版本中已经移除这个命令了,具体等6月27日正式版发出后才知道最后的情况

CoreFX(.NET Core Libraries)

CoreFX主要包含数个公共库,例如 System.Collections, System.IO, System.Xml等。CoreFX是 .NET Standard Library 的实现,同样的.NET Framework 4.6.3也是基于.NET Standard Library的实现。它们目前都是基于.NET Standard Library1.6版本,具体见下表:

standard

.NET Core 代码开发、部署、运行过程

编译

从上图可以看到使用JIT编译和使用AOT编译源代码并运行程序是两种不同的流程。

如果使用JIT编译器部署程序时只需要将程序打包为IL的assemblies,在方法第一次执行前编译器将IL编译为目标机机器码(Native code),而AOT编译会在编译时将源代码直接编译为目标机机器码。

AOT将源代码编译为机器码,拥有如下特性:

  • 用静态代码替换反射,例如如果一个值类型(value type)没有重写 ValueType.Equals 的equals的方法,默认情况判断相等,会使用反射找到filedinfo以确定type是否相等,然后再比较value是否相等。而在AOT编译中由于替换了反射因此只能比较value是否相等。

  • 依赖的第三方类库以及.NET Libraries均打包至最终编译的程序中。

  • 打包后的程序运行在一个精简版的运行时上(CoreRT)主要包含垃圾回收器,而运行时也会打包在app文件中。

  • 虽然编译时会替换反射代码,但遇动态反射代码无能为力,运行时若遇动态反射调用则会因找不到对应的元数据及实现而抛出异常。解决办法是编译前配置运行时指令文件(Runtime directive file)指定需要用到的程序集。

总结

本节介绍了.NET Core的构成体系,包括新增的多个编译器以及遵循.NET Standard Library的CoreFX,总体来说.NET Core较之前的.NET Framework 从性能和开发效率上都有很大的提升。关键是首次实现了.NET的完全跨平台能力的基础技术栈。

.NET Core 基于跨平台能力,并没有将与 GUI 高度相关的 API 移植到 .NET Core 内,因此像是 Windows Forms 或是 Windows Presentation Foundation (WPF) 并未移植到 .NET Core。.NET Core 支持控制台应用程序 (Console Application) 以及类库 (Class Library) 类型的项目。

不过微软在其 Universal Windows Platform (UWP) 开发平台使用了 .NET Core,并且利用 .NET Native 技术将其性能提升至十分接近原生码的速度。

ASP.NET Core 则以控制台应用程序驱动其托管环境 Kestrel Server 以支持 ASP.NET Core 程序的运行。


作者:帅虫哥 出处: http://www.cnblogs.com/vipyoumay/p/5613373.html

参考链接

【1】https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md

【2】https://github.com/dotnet/corefx

【3】https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/glossary.md

【4】https://www.microsoft.com/net/core#windows

【5】https://msdn.microsoft.com/en-us/library/dn807190(v=vs.110).aspx

【6】https://blogs.msdn.microsoft.com/dotnet/2013/09/30/ryujit-the-next-generation-jit-compiler-for-net/

【7】https://zh.wikipedia.org/wiki/.NET_Core

转载于:https://www.cnblogs.com/vipyoumay/p/5613373.html

相关文章:

【CTF】实验吧 奇怪的短信

和实验吧 The Flash-14有些类似&#xff0c;总共的数字数目是偶数&#xff0c;所以两两分开&#xff0c;题干中的“短信”是提示&#xff0c;观察两两分组的第二个数字没有超过四的&#xff0c;可以想到手机上的九键 例如第一组数&#xff1a;33 对应的是F&#xff0c;最后全部…

mybatis结合log4j打印SQL日志

mybatis结合log4j打印SQL日志1.Maven引用jar包 默认的mybatis不能打印出SQL日志&#xff0c;不便于查看调试&#xff0c;需要结合log4jdbc-log4j2就可以完整的输入SQL的调试信息。 pom.xml 配置maven&#xff0c;注意以下3个都需要<dependency><groupId>org.bgee.l…

EOS Chain/Wallet RPC API的PHP开发包

2019独角兽企业重金招聘Python工程师标准>>> 介绍一个EOS Chain/Wallet RPC API的PHP开发包。 开始 你可以查看EOS的RPC API参考&#xff0c;但要注意缺少一些较新的方法。Wallet RPC API实现EOS v1.1.0 of RPC API reference。此外&#xff0c;这些文档中的一些示例…

深入浅出理解Paxos算法

Paxos算法是莱斯利兰伯特&#xff08;英语&#xff1a;Leslie Lamport&#xff0c;LaTeX中的「La」&#xff09;于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。 Paxos算法一开始非常难以理解&#xff0c;但是一旦理解其实也并不难&#xff0c;之所以难理解其…

显示界面的普通仓库

实际脚本如下 procedure xianshi_PTCK(Npc: TNormNpc; Player: TPlayObject);procedure CWPRPTCK_QWP(Npc: TNormNpc; Player: TPlayObject; Args: TArgs); beginplayer.TakebackStorageItem(Args.Int[0]);cangku.xianshi_PTCK(npc,player); end; procedure xianshi_PTCK(Np…

【CTF】实验吧 围在栅栏中的爱

对摩斯密码进行解码&#xff1a;kiqlwtfcqgnsoo QWE是键盘上的前三个&#xff0c;ABC是26个字母的前三个。所以&#xff0c;二者有这样的对应关系。 #include <stdio.h> #include <string.h> int main () {char zc[]"abcdefghijklmnopqrstuvwxyz"; cha…

nginx tomcat https

1.首先确保机器上安装了openssl和openssl-devel #yum install openssl #yum install openssl-devel2. server {listen 443 ssl;server_name vota.swmmotors.com.cn;ssl_certificate cert/vota.swmmotors.com.cn_bundle.crt; #当前conf/目录下ssl_certificate_…

Spring4实战学习笔记

《Spring4实战 第4版》2016年4月新出版的&#xff0c;之前的第三版看起来还是不错的&#xff0c;所以看到新版就直接买下来。 英文版源码地址&#xff1a;Spring in Action, Fourth Edition Covers Spring 4 1.IOC装配Bean 参考【Spring实战4 2.2】&#xff0c;作者提倡无XML…

vmstat 命令

2019独角兽企业重金招聘Python工程师标准>>> 1.用法 vmstat [-a] [-n] [-S unit] [delay [ count]] vmstat [-s] [-n] [-S unit] vmstat [-m] [-n] [delay [ count]] vmstat [-d] [-n] [delay [ count]] vmstat [-p disk partition] [-n] [delay [ count]] vmstat […

【CTF】实验吧 疑惑的汉字

考察的是当铺密码&#xff1a; 王夫 井工 夫口 由中人 井中 夫夫 由中大&#xff1a;67 84 70 123 82 77 125 当铺密码就是一种将中文和数字进行转化的密码&#xff0c;算法相当简单:当前汉字有多少笔画出头&#xff0c;就是转化成数字几。

Date PHP

转载于:https://www.cnblogs.com/liuliang389897172/p/10087895.html

Java多线程的11种创建方式以及纠正网上流传很久的一个谬误

创建线程比较传统的方式是继承Thread类和实现Runnable&#xff0c;也可以用内部类&#xff0c;Lambda表达式&#xff0c;线程池&#xff0c;FutureTask等。 经常面试会问到继承Thread类和实现Runnable的区别&#xff0c;然后网上会流传如下这样的说法&#xff0c;这是错误的。…

【CTF】实验吧 古典密码

一共是35个字符分成5*7或者7*5 最终选择5行7列 首先变动第一行的位置&#xff0c;然后根据第一行变动的位置&#xff0c;依次变动下面的行 OCU{CFT ELXOUYD ECTNGAH OHRNFIE NM}IOTA CTF{COU LTYOUEX CHANGET HEINFOR MATION} CTF{COULTYOUEXCHANGETHEINFORMATION}

对比React Native、dcloud、LuaView三个框架技术(内部)

转载自&#xff1a;http://www.jianshu.com/p/ee1cdb33db8d主要对比React Native和5SDK&#xff08;就是dcloud的SDK&#xff09;两个&#xff1a; 开发语言&#xff1a;三个都是用其他语言来统一开发IOS、android应用的框架技术&#xff0c;其中&#xff0c;React Native是使用…

spring boot 临时文件过期

2019独角兽企业重金招聘Python工程师标准>>> 第一种方案&#xff1a;-Djava.io.tmpdir /xxx 第二种方案&#xff1a; 线上的系统中不能上传文件了&#xff0c;出现如下错误&#xff1a; org.springframework.web.multipart.MultipartException: Could not parse mu…

ASP.NET MVC+Bootstrap个人博客之打造清新分页Helper(三)

0. 没有找到一款中意的分页插件&#xff0c;又不想使用现成的(丑到爆)&#xff0c;所以自己动手造一个吧 先看下效果(其实也不咋滴...)&#xff1a; 有点另类&#xff0c;分页直接是在后台拼接好html&#xff0c;然后发送到前台的&#xff1a; 1. 分页容器&#xff1a; <di…

支撑Java框架的基础技术:泛型,反射,动态代理,cglib

以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型&#xff0c;反射同时对于一些高级技术例如动态代理&#xff0c;cglib和字节码技术也需要掌握&#xff0c;下面就按章节来一一说清楚这些技术的核心部分&#xff0c;最后手写一个简单的Spring框架。 一.静态代…

【CTF】实验吧 困在栅栏里的凯撒

题目先提到栅栏&#xff0c;再提到凯撒&#xff0c;按照顺序先栅栏解码&#xff0c;再凯撒解码。 一般密码的开头不是flag就是key或者ctf 所以选择“6栏”&#xff0c;在进行凯撒解码 在所有组合中&#xff0c;发现CTF即为flag

经典算法书籍推荐以及算法书排行【算法四库全书】

经典算法书籍推荐以及算法书排行【算法四库全书】 作者&#xff1a;霞落满天 https://linuxstyle.blog.csdn.net/ https://blog.csdn.net/21aspnet 行文方式&#xff1a;类似《四库全书》截取经典算法书目录和精华篇章 版权说明&#xff1a;本文于2019年5月5日首发于CS…

【CTF】实验吧 Fair-Play

它的标题就是题解的提示&#xff1a;Play-Fair Playfair解密算法首先将密钥填写在一个5*5的矩阵中&#xff08;去Q留Z&#xff09;&#xff0c;矩阵中其它未用到的字母按顺序填在矩阵剩余位置中&#xff0c;根据替换矩阵由密文得到明文。 对密文解密规则如下&#xff1a; 1 若c…

【DAY23】JVM与反射的学习笔记

JVM:-----------------1.JVM: java virtual machine.2.class file *.class3.ClassLoader4.runtime data area运行时数据区。1.Method area : 方法区.(shared)供所有线程共享.2.heap(shared):供所有线程共享.3.java stack(栈区)独占的。4.native method stack(本地方法栈)独占5.…

BZOJ2281:[SDOI2011]黑白棋(博弈论,组合数学,DP)

Description 小A和小B又想到了一个新的游戏。这个游戏是在一个1*n的棋盘上进行的&#xff0c;棋盘上有k个棋子&#xff0c;一半是黑色&#xff0c;一半是白色。最左边是白色棋子&#xff0c;最右边是黑色棋子&#xff0c;相邻的棋子颜色不同。小A可以移动白色棋子&#xff0c;小…

高性能微服务架构设计模式@霞落满天

高性能微服务架构设计模式 主讲&#xff1a;霞落满天 现在企业开发都是微服务架构&#xff0c;但是有很多问题&#xff0c;比如分布式定义&#xff0c;分布式的微服务怎么拆分&#xff0c;什么时候拆分&#xff0c;怎么做到高性能&#xff0c;中台怎么设计&#xff0c;读写分…

【数据结构】顺序栈的实现(C语言)

栈的基本概念及其描述 栈是一种特殊的线性表&#xff0c;规定它的插入运算和删除运算均在线性表的同一端进行&#xff0c;进行插入操作和删除操作的那一端称为栈顶&#xff0c;另一端称为栈底。 栈的插入操作和删除操作分别称为进栈和出栈。 FILO&#xff08;First In Last …

iOS绘制图片与文字

2019独角兽企业重金招聘Python工程师标准>>> #####绘制图片与文字 #####1.绘制图片&#xff0c;直接代码说明 加载图片 #pragma mark - 小黄人 -(void) drawImage:(CGRect) rect{UIImage *image[UIImage imageNamed:"黄人"];//图片有可能显示不全&#xf…

php-fpm慢执行日志

vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下内容request_slowlog_timeout 1slowlog /usr/local/php-fpm/var/log/www-slow.log 测试&#xff1a;/usr/local/php-fpm/sbin/php-fpm -t/etc/init.d/php-fpm reloadls ../../var/log/ //生成日志php-fpm.log www-sl…

spring springboot springcloud常用注解

SpringBootApplication 组合注解&#xff0c;用在启动类上&#xff0c;源码&#xff1a; Retention(RetentionPolicy.RUNTIME) SpringBootConfiguration EnableAutoConfiguration ComponentScan public interface SpringBootApplication SpringBootConfiguration Configurat…

解决eclipse ctrl+鼠标左键不能用

选择【Window】菜单 Preferences ——>General——>Editors——>Text Editors——>Hyperlinking 把勾都点上,然后确定KEY 值为 crtl

【数据结构】顺序队列的实现(C语言)

队列的基本概念及其描述 队列是一种特殊的线性表&#xff0c;它的特殊性在于队列的插入和删除操作分别在表的两端进行。 插入的那一端称为队尾&#xff0c;删除的那一端称为队首。队列的插入操作和删除操作分别称为进队和出队。 先进先出&#xff08;First In First Out&…

ethereumjs/ethereumjs-vm-2-API文档

https://github.com/ethereumjs/ethereumjs-vm/blob/master/docs/index.md vm.runBlockchain Processes blocks and adds them to the blockchain 处理区块并将其添加到区块链中 Parameters输入参数 blockchain Blockchain A blockchain that to process 一个处理的区块链cb Fu…