obsidian/笔记文件/2.笔记/CTS、CLS和CLR.md
2025-03-26 00:02:56 +08:00

4.1 KiB
Raw Permalink Blame History

#unity/日常积累

C#.NET中的CTS、CLS和CLR

在学习.NET的过程中都会不可避免地接触到这三个概念那么这三个东西是什么以及它们之间的关系是怎样的呢我们在学习的过程中可能比较过多的会去关注CLR因为CLR是.NET Framework的核心但是我要说的是CTS和CLS更为重要因为他们是CLR的核心。任何编程语言如果想要在.NET CLR上执行就必需提供一个编译器将此语言的程序编译成.NET CLR所认识的metadata以及IL符合CTS的规定。并非所有的语言都能和C#一样符合CTS的规范毕竟许多语言出现在先CTS出现在后所以有一些旧的语言未能符合CTS的规定。这类的语言在.NET中有下列三种方式来符合CTS规范

  • 改变语言本身以符合CTS的规定。例如Visual Basic 6就为此做了大幅度的扩充与改变加上继承的特性这使得新版的Visual Basic .NET 差不多可以算是一个全新的语言了犹如当年C衍生出C++一样。

  • 扩充语言本身以接近CTS的规定但仍保留不相容于CTS的语法如此一来程序中符合CTS规定的以CTS方式编译不符合CTS规定的则以传统的方式编译成native code。例如C++ with Managed Extension (简称MC++) 就是如此。

  • 语言本身尽量维持不变一切都是通过超强的编译器设计来达成和CTS的相容Eiffel就是如此的作法。例如CTS不支援多重继承(multiple inheritance)但是Eiffel支援多重继承通过Eiffel的编译器可以利用interface以及attribute来达到多重继承(这样的作法相当巧妙,有兴趣的读者不妨去研究一下)。

好,现在让我们来看一下它们三者的关系。

1)CTS通用类型系统(Common Type System)

CTS不但实现了COM的变量兼容类型而且还定义了通过用户自定义类型的方式来进行类型扩展。任何以.NET平台作为目标的语言必须建立它的数据类型与CTS的类型间的映射。所有.NET语言共享这一类型系统实现它们之间无缝的互操作。该方案还提供了语言之间的继承性。例如用户能够在VB.NET中派生一个由C#编写的类。我们可以将CTS 看成是所有.NET 语言的superset (union)而符合CTS 的各种不同的语言其实都只是CTS 的subset (intersection)。这些语言所写出来的程序,如果想要有最佳的相容性,以便互相调用(invoke) 或继承这些语言之间就必需取得一个共同的subset有共同遵守的规范这就是CLS 。

2)CLS通用语言规范(Common Language Specification)

很显然,编程语言的区别不仅仅在于类型。例如,一些语言支持多继承性,一些语言支持无符号数据类型,一些语言支持运算符重载。用户应认识到这一点,因此.NET通过定义公共语言规范(CLSCommon Language Specification)限制了由这些不同引发的互操作性问题。CLS制定了一种以.NET平台为目标的语言所必须支持的最小特征以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。认识到这点很重要这里讨论的特征问题已不仅仅是语言间的简单语法区别。例如CLS并不去关心一种语言用什么关键字实现继承只是关心该语言如何支持继承。CLS是CTS的一个子集。这就意味着一种语言特征可能符合CTS标准但又超出CLS的范畴。例如C#支持无符号数字类型该特征能通过CTS的测试但CLS却仅仅识别符号数字类型。因此如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。

3)CLR公共语言运行库(Common Language Runtime)

简单地说CLR是CTS的实现也就是说CLR是应用程序的执行引擎和功能齐全的类库该类库严格按照CTS规范实现。作为程序执行引擎CLR负责安全地载入和运行用户程序代码包括对不用对象的垃圾回收和安全检查。在CLR监控之下运行的代码称为托管代码(managed code)。

参考:《.NET分布式编程——C#篇》