初读CLR Via C# 之 IL、CTS、CLS

本章将对CLR中的ILCTSCLS进行一个大概的总结。下章将开始第二章的内容。

IL我们称之为高级汇编语言或者中间语言,在我们编写基于.NET框架下的程序(不论是C#VB或者J#等)在被编译成本地CPU指令前,都将被编译成IL语言,再有CLRIL语言进行编译和控制。比如用VB在控制台应用程序写入如下代码:

    Sub Main()

        Console.WriteLine("VB")

 End Sub

再用C#在控制台应用程序写入如下代码:

static void Main(string[] args)

{

       Console.WriteLine("Test");

}

虽然语法完全不一样(除了输出比较相似外),但是如果我们用微软的MSIL反汇编程序加载编译完成后的exe文件,如图:

 

 

 

1.1

 

      1.2

 

上面两张图中图1.1为编译完成后VB语言的代码,图1.2为编译完成后C#的代码,在我画红线的地方大家可以看出,出了第一行(红线)不一样为我们输出的字符串外,第二行(红线)是完全一样,也就是说不管在平台下什么语言进行编程,编译器最终都会把它编译成统一的IL代码(相同功能,比如示例中的控制台输出指令)。通过上面的示例可以很容易的看出CLR是如何支持多语言集成的,只是需要不同的编译器,把源文件编译成面向CLRIL代码,就可以在.NET框架下面运行。

什么是CTS

CTSCommon Type System 通用类型系统)是由微软制定的一个规范,它表述了一个类型的定义和行为。既然CTS是一组规范,那么都规定了什么呢?

一、CTS规定一个类型可以包含零个或多个成员(字段、属性、方法、事件);

二、CTS规定了一个类型的可视原则。就是我们所说的权限修饰符(publicprivateprotectedinternal

三、CTS规定任何类型都只能从一个类型中派生,即:System.Object类型。(虽然C++支持多集成,但是在.NET框架下,如果编译器发现开发人员使用了多集成,违反了CTS的这一规定,编译器就会报错。)

什么是CLS

  CLSCommon Language Specification 公共语言规范)是由微软制定的一个各个语言间都支持的功能。也就是说,CLSCTS的一个子集,而这个子集是.NET框架下面所有编程语言都必须遵守的(如果需要C#VC++的应用程序进行通信)。说的更详细一点就是说,如果你想用C#调用C++的组件,那么C++所使用的语法(如果该方法为public,如果方法不为public的话,CLS不进行约束),必须保证C#能够操作。可是C++程序员不一定知道C#能不能操作他所写的方法,这个时候就需要CLS进行约束,以保证C#能正常的调用C++的组件。

 

1.3

 

1.3中大家可以看出,CLR\CTS.NET框架下的所有语言提供了一个大的功能集。每一个语言都使用了CLR\CTS的一个子集。但是这个子集中都包含了CLS这个最小的子集。也就是说所有语言的功能及都必须支持CLS最小的供能集。

     到此这本书的第一章笔者只领悟到这些东西,可能还有更深层次的东西,由于笔者的水平有限,也只能到这里了。如有不对的地方、不准确的地方,希望各位看官都能即时的提出。以便笔者学习和纠正博文中的错误,谢谢!

   

转载于:https://www.cnblogs.com/BreatheLee/archive/2011/09/15/2177400.html

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

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

相关文章

Ubuntu安装Samba实现跟windows文件共享

From: http://js8.in/526.html 为了开发项目的方便,要实现Ubuntu跟windows文件共享,需要在Ubuntu下搭建samba服务器,下面来说说Ubuntu下安装、配置Samba的详细步骤~ Ubuntu下安装Samba 可以使用新立得来搜索Samba安装~没有请更新软件源&…

POJ1182--带权并查集

带权并查集就是除了维护一个fa数组以外,维护一个rank数组,有两层含义,一个是路径压缩时边的权值,,再一个是当前点与根节点的相对关系。这个题很明显考察的是 根节点与当前节点的一种相对关系,让rank【x】 …

Qt MQTT使用

一、创建对象并绑定信号槽 m_client new QMqttClient(this); connect(m_client, &QMqttClient::stateChanged, this, &MainWindow::updateLogStateChange); connect(m_client, &QMqttClient::disconnected, this, &MainWindow::brokerDisconnected); connect…

20231222给NanoPC-T4(RK3399)开发板的适配Android11的挖掘机方案并跑通AP6398SV

20231222给NanoPC-T4(RK3399)开发板的适配Android11的挖掘机方案并跑通AP6398SV 2023/12/22 7:54 简略步骤:rootrootrootroot-X99-Turbo:~/3TB$ cat Android11.0.tar.bz2.a* > Android11.0.tar.bz2 rootrootrootroot-X99-Turbo:~/3TB$ tar jxvf Android11.0.tar.…

Web服务器捉虫速记

一服务器疑似被挂马&#xff0c;现象是从百度搜该站点&#xff0c;出来的结果大部分为色情网站。 马上登录服务器&#xff08;半夜好困啊&#xff09;。执行如下的步骤&#xff1a;<!--[if !supportLists]-->1、 <!--[endif]-->检查系统帐号&#xff0c;看有没有异…

KEIL5 编译器导致的程序异常

STM32F407写程序过程中发现了一个KEIL5 ARM编译器导致的BUG&#xff0c;记录如下。 源代码比较简单&#xff0c;分别打印两个标志量的值&#xff0c;采用了volatile 声明&#xff0c;避免被优化。 代码功能不用多说&#xff0c;看一下输出结果&#xff1a; 两个标志量都被编译…

C++笔记(1)explicit构造函数

From: http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html 按照默认规定&#xff0c;只有一个参数的构造函数也定义了一个隐式转换&#xff0c;将该构造函数对应数据类型的数据转换为该类对象&#xff0c;如下面所示&#xff1a;class String {String ( const …

高级软件工程课程第一次作业的小结

成果&#xff1a; 1&#xff09;各位同学按要求建立了自己博客&#xff0c;完善并反馈的相关信息 2&#xff09;对各自本科设计进行了分析&#xff0c;有的同学也写得比较详细&#xff0c;如曾秀、李文华、吴文兵等 存在的问题&#xff1a; 1&#xff09;对软件工程的认识较基础…

Windows中添加svnserve作为系统服务

安装subversion后&#xff0c;其安装目录中有svnserve程序。 采用windows系统的sc命令将其添加为自动启动的系统服务&#xff1a; sc create MySVNServer binpath "D:\Program Files\Subversion\bin\svnserve.exe --service -r G:\Repositories" displayname "S…

[react] 在React中如何引入图片?哪种方式更好?

[react] 在React中如何引入图片&#xff1f;哪种方式更好&#xff1f; 第一种导入&#xff1a; import Img from "./images/1.png" 第二种直接获取图片&#xff1a; <img src{require("./images/1.png")} alt""/> 个人简介 我是歌谣&a…

STM32F407控制AD7606 采用HAL库的TIM和SPI

前言 本文介绍基于STM32F407的AD7606 8通道同步采集控制方式&#xff0c;总体思路&#xff1a;PWM驱动AD7606完成模数转换&#xff0c;AD7606转换完成后其BUSY引脚给出下降沿&#xff0c;STM32捕获外部中断并在中断服务程序中调用SPI串口读取AD7606数据&#xff0c;工程采用cu…

(转)二分图最大匹配的König定理及其证明

出处:http://www.matrix67.com/blog/archives/116 二分图最大匹配的Knig定理及其证明 如果你看不清楚第二个字母&#xff0c;下面有一个大号字体版本&#xff1a;二分图最大匹配的Knig定理及其证明 本文将是这一系列里最短的一篇&#xff0c;因为我只打算把Knig定理证了&…

如何使用struts2对集合参数进行验证

上一节介绍了struts2可以支持批量表单参数提交&#xff0c;那么提交到后台时如何利用strust2的validation框架对这个集合做验证&#xff1f; struts2提供了一个vistor校验器&#xff0c;可以实现这个需求 还是采用上一节中批量添加书籍的例子 1.jsp文件 <% taglib prefix&qu…

关于__attribute__ ((packed))

#include <iostream>using namespace std;typedef struct {unsigned char ver;unsigned char cmd;unsigned short id;unsigned short retcode; }__attribute__ ((packed)) ACKPACK_CMD;struct my {char ch; int a; }__attribute__ ((packed)); // 取消结构在编译过程中…

[react] React中验证props的目的是什么?

[react] React中验证props的目的是什么&#xff1f; 对属性进行强检验&#xff0c;避免运行时报错 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

[Axure教程]0001.新手入门基础

Axure RP是一个专业的快速原型设计工具。Axure&#xff08;发音&#xff1a;Ack-sure&#xff09;&#xff0c;代表美国Axure公司&#xff1b;RP则是Rapid Prototyping&#xff08;快速原型&#xff09;的缩写。Axure RP已被一些大公司采用。Axure RP的使用者主要包括商业分析师…

typedef和#define的作用域问题

#include <iostream>using namespace std;class A { #define MAX 5 // 宏定义是全局的&#xff0c;因为在预编译时就替换掉了public:typedef unsigned long ULONG; // 作用域局限在这个类中, 且有修饰符private:int _n;ULONG _age;public:A(int n, ULONG age);void …

【评论】GNU/Linux下有多少是GNU的?

导读&#xff1a;一个葡萄牙的学生写了一篇文章 《How much GNU is there in GNU/Linux?》由酷壳网的陈皓整理编译为《GNU/Linux下有多少是GNU的》。这篇文章主要分布了今年4月份的Ubuntu Natty的Linux分发包。其主要是用代码行来做的分析&#xff0c;用两个饼图对比分析。内容…