【C# Personal Handbook】运行环境

一、CLR、CLI、CTS、CLS、BCL、FCL简介

  • CLI(公共语言基础)

CLI是微软公司向ECMA提交的一份语言和数据格式规范,CLR是目前为止唯一一个公共语言基础的实现版本。CLI包括了公共类型系统(CTS)、公共中间语言(CIL)、底部文件格式以及元数据格式等。

  • CLR(公共语言运行库)

CLR是一个CLI的实现,包含了.NET运行引擎和符合CLI的类库。我们开发的几乎所有的.NET程序都基于CLR的类库来实现,并且运行在CLR提供的运行引擎之上。

  • CTS(公共类型系统)

CTS定义了一个能够在CLR上运行的语言规范。尽管有很多语言本身不符合CTS规范,但是通过加强编译器,改变语言附加规范等手段,使得许多语言能够编写出能在CLR上运行的程序。一种语言编写的程序编译能够在CLR上运行,并不代表这种语言本身完全符合CTS的规范。例如C++语言,仍然保持了其不符合CTS规范的部分,并且在编译时把这部分不符合CTS的代码编译成原始代码而非中间代码。

  • CLS(公共语言规范)

CLS是CTS的一个子集,它定义了希望编写在.NET平台上运行的程序的语言所需符合的最小规范。正因为.NET允许由不同语言编写的程序一起执行,所以才制定出CLS规范,用以避免不同语言特性产生的错误。在.NET Framework中,几乎所有(但不是所有)的类都是与CLS兼容的。在MSDN文档说明中,不兼容的类和方法都被特别标记为不兼容,例如System命名空间中的UInt32结构。UInt32表示32位无符号整数。并不是所有的语言(例如Visual Basic.NET或J#)都支持无符号的数据类型,这种数据类型是与CLS不兼容的。

  • BCL,基础类库(Base Class Library)

BCL是一个公共编程框架,称为基类库,所有语言的开发者都能利用它。是CLI(Common Language Infrastructure,公共语言基础结构)的规范之一,主要包括:执行网络操作,执行I/O操作,安全管理,文本操作,数据库操作,XML操作,与事件日志交互,跟踪和一些诊断操作,使用非托管代码,创建与调用动态代码等,粒度相对较小,为所有框架提供基础支持。

  • FCL,框架类库(Framework Class Library)

FCL提供了大粒度的编程框架,它是针对不同应用设计的框架 ,FCL大部分实现都引用了BCL,例如我们常说的开发框架:ASP.NET(Core)、Windows Forms、WPF等等,提供了针对不同层面的编程框架 。

二、CLR

通用语言执行平台(Common Language Runtime,简称CLR)是微软为他们的.NET的虚拟机所选用的名称。它是微软对通用语言架构(CLI)的实现版本,它定义了一个代码执行的环境。CLR执行一种称为通用中间语言的字节码,这个是微软的通用中间语言实现版本。CLR目前已稳定运行于各个平台之中。

CLR 和类库与应用和整个系统的关系

68652c71f1292f0cff1ebae22536c885.png

来源 :https://docs.microsoft.com/tr-tr/dotnet/framework/get-started/overview CLR 组件

ea3b647eb075615eedf24ed1266cb362.png

来源 :https://www.slideshare.net/Thenmurugeshwari/architecture-of-net-framework

在 CLR 中,垃圾回收器充当自动内存管理器。C# 以及 CLR 之上的其他语言的内存都是通过垃圾回收器回收的。

CLR 主要功能

  • 基类库支持 Base Class Library Support

  • 内存管理 Memory Management

  • 线程管理 Thread Management

  • 垃圾回收 Garbage Collection

  • 安全性 Security

  • 类型检查 Type Checker

  • 异常管理 Exception Manager

  • 调试管理 Debug Engine

  • 中间码(MSIL)到机器代码(Native)编译

  • 类别装载 Class Loader

开发人员使用高级编程语言编写程序。接下来编译器将代码编译成微软的中继语言(MSIL)。执行的时候CLR会将MSIL码转换为操作系统的原生码(Native code)。CLR内置有即时编译器。实际上,CLR代理了一部分传统操作系统的管理功能,通常将在CLR的控制下运行的代码称为托管代码,否则称为非托管代码。

执行流程

将源代码(vb、cs)编译成托管代模块。托管代码块由中间语言和元数据组成。将托管代码合并成程序集。加载公共语言运行库。执行程序集的代码。生成本地代码。

优点

它通过在运行时提供程序之间提供丰富的交互来提高性能。通过消除在支持程序的任何操作系统上重新编译程序的需要来增强可移植性。安全性也会提高,因为它会分析MSIL指令是安全的还是不安全的。此外,使用委托代替函数指针增强了类型的安全性。在垃圾回收器的帮助下支持自动内存管理。提供跨语言集成,因为 CLR 中的 CTS 提供了一个通用标准,该标准激活了不同的语言以扩展和共享彼此的库。支持使用在其他 .NET 编程语言中开发的组件。提供语言、平台和体系结构独立性。它允许轻松创建可扩展的多线程应用程序,因为开发人员无需考虑内存管理和安全问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何完善自己的知识结构

★领域 (本来想用“学科”这个词,后来觉得“学科”的范畴还是偏小,就改用“领域”)  按照传统的习惯,通常会把知识归类到不同的领域(比如:文学、数学、计算机、烹调、等等)。 ◇领…

MATLAB编程与应用系列-关于MATLAB编程入门教程的总体编写安排

本系列教程来源于出版设计《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968qq.com。 出版社:人民邮电出版社, 页数:525。 本系列教程目前基于MATLABR2006a,可能对于更高级…

python语言特性-------python2.7教程学习【廖雪峰版】(一)

开始学习廖雪峰的py2.7教程: 2017年6月5日12:54:28 笔记: 廖雪峰python2.7教程1.用任何编程语言来开发程序,都是为了让计算机干活。 2.Python是一种相当高级的语言。代码少还不好?代码少的代价是运行速度慢。3.用Python可以做什么…

java调c++代码_Java中调用C++代码的实现 | 学步园

JNI为 Java Native Interface 即Java本地接口,使用此种方式可以对C/C代码进行调用,其在本质上是对C/C生成的动态库进行调用而不是直接对C/C代码进行调用Java代码如下:public class TestJNI{//JNI在本质上是调用C/C的动态库来实现的&#xff…

jeesite1.X 集成多数据源

2019独角兽企业重金招聘Python工程师标准>>> 网上看了几个例子,都是相同数据源的动态切换,如果不是同一种数据库类型,分页查询就出问题。经过研究解决问题。 jeesite.properties配置多数数据源地址,这里以mysql5.7和sqlserver2008…

k8s HPA(HorizontalPodAutoscaler)-自动水平伸缩

Horizontal Pod Autoscaling in Kubernetes写在前面我们平时部署web服务,当服务压力大撑不住的时候,我们会加机器(加钱);一般没有上容器编排是手动加的,临时加的机器,临时部署的服务还要改Nginx的配置,最后…

jQuery 基金会和 Dojo 基金会合并:Open Web

统一基金会,服务开发人员,推动开放 Web 技术发展jQuery 基金会和 Dojo 基金会今天宣布计划联合,旨在建立最大,最多样化和最全面的基金会,通过服务开发者,他们的项目,他们的社区来构建开放的 Web…

spark java 逻辑回归_逻辑回归分类技术分享,使用Java和Spark区分垃圾邮件

原标题:逻辑回归分类技术分享,使用Java和Spark区分垃圾邮件由于最近的工作原因,小鸟很久没给大家分享技术了。今天小鸟就给大家介绍一种比较火的机器学习算法,逻辑回归分类算法。回归是一种监督式学习的方式,与分类类似…

jQuery.extend()方法

定义和用法jQuery.extend()函数用于将一个或多个对象的内容合并到目标对象。 注意: 1. 如果只为$.extend()指定了一个参数,则意味着参数target被省略。此时,target就是jQuery对象本身。通过这种方式,我们可以为全局对象jQuery添加…

1066. 图像过滤(15)

原题: https://www.patest.cn/contests/pat-b-practise/1066 思路: 开胃小菜 实现: #include <stdio.h>int main (void) {int m;int n;int a;int b;int c;char ch;int tmp;int i;int j;scanf("%d %d %d %d %d", &m, &n, &a, &b, &c);// 题…

Wget用法、参数解释的比较好的一个文章

一个语句就可以下载cvpr2016的全部论文&#xff1a; wget -c -N --no-clobber --convert-links --random-wait -r -p -E -e robotsoff -U mozilla http://www.cv-foundation.org/openaccess/CVPR2016.py 其中&#xff0c;-c表示断点续传&#xff1b;-N表示已经下载的内容不再重…

.NET VS智能提示汉化 (.Net6)

先上现成的.net6汉化文件&#xff0c;可以手动下载后参照 [如何为 .NET 安装本地化的 IntelliSense 文件 ](https://learn.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense)进行安装。或者使用后文的工具进行自动安装。无对照英文在前中文在前汉化内容来自 官…

go 返回mysql数组_Go基础之--操作Mysql(一)

关于标准库database/sqldatabase/sql是golang的标准库之一&#xff0c;它提供了一系列接口方法&#xff0c;用于访问关系数据库。它并不会提供数据库特有的方法&#xff0c;那些特有的方法交给数据库驱动去实现。database/sql库提供了一些type。这些类型对掌握它的用法非常重要…

Vue CLI 3开发中屏蔽烦人的EsLint错误

问题 Vue开发中&#xff0c;特别是当你阅读分析别人的其中早期版本的Vue代码时往往会遭遇到满屏幕的烦人的EsLint错误。有关EsLint这个工具的作用不再赘述。查阅网上参考文档&#xff0c;大多是针对早起版本Vue CLI工具项目的&#xff0c;在我最新使用的Vue CLI 3生成的工程中根…

pyinstaller---将py文件打包成exe

pyinstaller可将Python脚本打包成可执行程序&#xff0c;使在没有Python环境的机器上运行。 1.pyinstaller在windows下的安装 直接在命令行用pip安装 pyinstaller&#xff0c; 在windows下&#xff0c;pyinstaller需要PyWin32的支持。当用pip安装pyinstaller时未找到PyWin32&am…

老人寻求到一名程序员,用2W行代码给自己打造了一幅肖像画

今天翻墙看了下国外的论坛&#xff0c;看到了一位版主给一位老人描绘肖像画的文章&#xff0c;不得不说这位大佬是真的厉害&#xff0c;近20000行代码&#xff0c;而且还画的很像&#xff0c;像小编我这种手残党&#xff0c;用笔也不能画出来&#xff0c;不得不服&#xff0c;今…

一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]

[接上篇]“天下大势&#xff0c;分久必合&#xff0c;合久必分”&#xff0c;ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系统中之后&#xff0c;也许微软还是意识到Web应用和后台服务的承载方式还是应该加以区分&#xff0c;于…

java jpa 模糊查询_JPA 以SQL实现分页不模糊查询(参数可能为空)

repository代码:package com.fancy.miniflow.repository;import java.util.List;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.data.jpa.repository.Q…

GitHub服务中断24小时11分钟事故分析报告\n

上周&#xff0c;GitHub经历了一次事故&#xff0c;导致服务降级24小时11分钟。虽然平台的某些部分不受事故影响&#xff0c;但仍然有多个内部系统受到了影响&#xff0c;向用户显示了过时且不一致的内容。所幸没有用户数据丢失&#xff0c;但针对几秒钟数据库写入的手动调整工…

8 旋转数组的最小数字

输入一个递增排序数组的一个旋转&#xff0c;输出旋转数组的最小元素例如1,2,3,4,5的一个旋转可以为3,4,5,1,2把一个数组的最开始若干个元素搬到数组的末尾&#xff0c;称之为数组的旋转 输出旋转数组的最小元素 C: 1 class Solution {2 public:3 int minInOrder(vector<…