还是啰嗦下:文章短并不代表文章质量不高。我最喜欢用干货性的以及总结性的语言 让大家明白文章要表达的内容。这一切,都是来自多年对.NET 的一些领悟以及一些理解。

不长篇大论,一本人也没时间,二本人也不想浪费大家宝贵的时间。

微软的 C# , IL,CLR,以及 Cup 之间的关系,网络上的文章很多,一些朋友看了一大堆也没看出所以然。一些文章 讲他们之间的关系,但是看了整篇文章都在阐述CLR 的内在原理。

我这里旨在用最简单的表述帮助大家理解他们之间的关系。

NOTIC START---开始:

C#:    是上层语言,也就是我们.NET 工作人员码代码的语言

IL:     是怎么形成的呢,IL 就是C# 通过宇宙级工具VS 编译后 存储的代码。并不是最终交由CUP 执行的代码,因此IL 更是一种编译后的文件代码,那么IL 存放在哪里呢 ,答案:EXE/DLL

CLR:   中间执行者。当程序运行时,CLR 将 IL 加载到进程管理,并将IL 解析成 针对性的 二进制的指令交由CUP 执行

CUP:最终执行者。

 

从编写代码到最终平台运行:

可执行文件: C#——>VS Compiler——>exe/dll(IL和Metadata)——>Runtime Engine(Class Loader)——>JIT Compiler——>Managed Native Code——>运行——>安全验证

如果是类库Class Library(IL和Metadata)则跳过Class Loader,直接进入JIT

那大家还会问:  那我们常见还有 .NET 领域常说的 CTS,CLS 

1:CTS: 是.NET 编译器工作的 重要的组成部分,你理解成它参与了c# 编译成 IL 的编译工作;

但是CTS 在定义范围上指定是: 通用类型系统, 从定义上看它主要参与的是编译工作的类型转换问题。

下面给出 CTS 在编译 工作中的作用:

  • 不仅可以把C#编译成.Net IL,还支持Basic、Python、Ruby等语言,甚至还支持Java。不同语言中的数据类型定义是不一样的,.Net中定义了通用的数据类型(CTS,Common Type System):String、Int16、Int32、Int64、Boolean、Double。通过转到定义可以看到这些都是类(结构体)。
  • Int64→long、Int32→int、Int16→short、String→string、Boolean→bool。每种语言都定义了自己的类型,.Net通过 CTS提供了公共的类型,然后翻译生成对应的.Net类型。
  • C#语言规范中定义了string、int、long、bool、double等原始类型,编译器会把这些类型翻译成CTS中的类。反编译看IL就能看到了。
  • string是c#中的类,string是.net Framework CTS的类
  • c# string映射为.net Framework的String 如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作 如果使用c#,建议使用string,比较符合规范。

2: CLS : 白话文说白了 就是 定义了 C# 以及 VB 等的 语言规范。

CLS 的作用很常见, 举个例子,例如我们定义一个类 ConvertToLower(string message) 的方法,然后我们在 例外一个类中调用的这个方法,然而,我们在例外一个地方调用的时候,不小心把 大写的 ConvertToLower 写成了 小写的  converttolower  这时候,VS 将会提示,因为C# 语言对大小时敏感的。但是,在VB 语言中,大写又不是敏感的,这些性质有谁决定,是有CLS 系统决定的。

不知我这样解释大家明白了吗,希望对大家有帮助。

干货扩展联想:

我们知道 IL 直接 交由 CLR  加载到运行内存中. 那么我们是否思考下,如果我的应用程序在运行过程中,我可否动态构建 IL 代码(也就是动态构建一个类),在运行时交由CLR 执行,那不是很强大。这个课题留个大家思考!

-----给大家提供一些思路:微软这个强大的帝国早就为我们做好这些事情,大家去了解下 微软 的这个类库,就明白了,我这边就不做长篇大论了:  System.Reflection.Emit.

(嘎吧)--微软的 C# , IL,CLR, Cup 之间关系以及扩展联想的更多相关文章

  1. SimpleSocket

    项目地址 :  https://github.com/kelin-xycs/SimpleSocket SimpleSocket 一个 用 C# 调用 Win Socket 2 的 程序 , 对 Win ...

  2. C#中IL, CTS, CLR, CLS, JIT含义

    1. IL/MSIL  (Microsoft Intermediate Language) 微软中间语言 (IL是MSIL的缩写,译为中间语言) 2. CTS  (Common Type System ...

  3. CLR 的执行模型(2)

    第一章 CLR 的执行模型(2) 本篇内容大纲 Framework 类库(Framework Class Library , FCL) 通用类型系统(Common Type System,CTS) 公 ...

  4. CLR、CLS、CTS概述

    在学习.NET的过程中,都会不可避免地接触到这三个概念,那么这三个东西是什么以及它们之间的关系是怎样的呢?任何编程语言,如果想要在.NET CLR上执行,就必需提供一个编译器,将此语言的程序编译成.N ...

  5. C# 多线程学习系列三之CLR线程池系列之ThreadPool

    一.CLR线程池 1.进程和CLR的关系一个进程可以只包含一个CLR,也可以包含多个CLR2.CLR和AppDomain的关系一个CLR可以包含多个AppDomain3.CLR和线程池的关系一个CLR ...

  6. 微软软件开发技术二十年回顾-.NET框架篇

    六. .NET框架篇 .NET是微软自从发布Windows 3.0以来最为激动人心的新技术,是微软战略上为下一个十年对服务器和桌面软件工程的第一步,是微软的一场世纪大豪赌.对于.NET,微软的定义是, ...

  7. CLR via C# 序列化读书笔记

    1. 序列化格式类 a. 二进制BinaryFormatter b. XML流 NetDataContractSerializer c. CLR类据类型与非CLR数据类型之间互操作 XmlSerial ...

  8. 微软Office与金山WPS Office有何私密关系?

    新浪科技讯,9月1日午间消息,国家工商总局在其官网公布消息称.对微软公司副总裁陈实进行反垄断调查询问,要求微软就其综合情况以及企业反映的微软公司Windows操作系统和Office办公软件相关信息没有 ...

  9. C# 在腾讯的发展(作者是微软连续10年的MVP)

    本文首发我的微信公众号"dotnet跨平台", 内容得到大家热烈的欢迎,全文重新发布在博客,欢迎转载,请注明出处. .NET 主要的开发语言是 C# , .NET 平台泛指遵循EC ...

随机推荐

  1. Effective Java读书笔记--创建和销毁对象

    1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build() ...

  2. 【HTB系列】靶机Frolic的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Hack The Box是一个CTF挑战靶机平台,在线渗透测试平台.它能帮助你提升渗透测 ...

  3. Java创建线程四种方式

    1.继承Thread类 public class MyThread extends Thread { public MyThread() { } public void run() { for(int ...

  4. Codeforces Round #533 (Div. 2) B. Zuhair and Strings(字符串)

    #include <bits/stdc++.h> using namespace std; int main() { int n,k;cin>>n>>k; stri ...

  5. Java 窗口 小马时钟

    写在前面: eclipse爽到 好多都是抄的,记不住原网址了 摸爆了 搞了一个无边框JFrame,给JFrame加入鼠标监听器实现了拖动 搞了按钮,可以关闭.最小化.始终显示在前.静音 icon是抄( ...

  6. Codeforces Round #651 (Div. 2) B. GCD Compression (构造)

    题意:有一个长度为\(2n\)的数组,删去两个元素,用剩下的元素每两两相加构造一个新数组,使得新数组所有元素的\(gcd\ne 1\).输出相加时两个数在原数组的位置. 题解:我们按照新数组所有元素均 ...

  7. .NET中使用DebuggerDisplay轻松定制调试

    前言 对于调试的方式有多种,不过在今天我们将看到的监视窗口对变量的监视,当然在这里我们是定制内部的变量值,或者说变量的显示与计算的内容. 注:监视窗口在调试时可以一次显示多个变量."快速监视 ...

  8. 缓冲区溢出实验 1 strcpy

    实验代码 https://github.com/TouwaErioH/security/tree/master/stack%20overflow 实验目的 Buffer over flow 漏洞利用实 ...

  9. nextLine()和next()的区别和使用方法

    最近在笔试,刷剑指Offer时,都是只需要把方法实现了就行.但是!!!笔试时候会发现,大部分会要求你把main函数也code出来,真是醉了,第一次笔试时候搞的晕乎乎的..... 废话不多说,那么在写输 ...

  10. C++ part7

    1.C++ 继承和组合 类的组合和继承一样,是复用的重要方式. 要优先使用组合而不是继承. 原因: 组合是黑箱复用,对局部类的内部细节不可见:继承是白箱复用,父类的内部细节可见,破坏封装性. 继承在编 ...