理论:
CLR是.NET Framework的核心,而CTS(common Type System)和CLS(common language System)是CLR的核心。任何编程语言,如果想要在.NET CLR上执行,就必需提供一个编译器,将此语言的程序编译成.NET CLR所认识的metadata以及IL,符合CTS的规定。并非所有的语言都能和C#一样符合CTS的规范,毕竟许多语言出现在先,CTS出现在后,所以有一些旧的语言未能符合CTS的规定。
先用图来解释三者之间的关系:
1)CTS通用类型系统(Common Type System)
CTS不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展。任何以.NET平台作为目标的语言必须建立它的数据类型与CTS的类型间的映射。所
有.NET语言共享这一类型系统,只有符合CTS的类型才能在CLR上运行,简单点说就是VB,C#,C++等DotNet支持的语言的类型集合。该方案还提供了语言之间的继承性。例如,用
户能够在VB.NET中派生一个由C#编写的类。我们可以将CTS看成是所有.NET语言的超集,而符合CTS的各种不同的语言,其实都只是CTS 的子集。这些语言所写出来的程序,如果
想要有最佳的相容性,以便互相调用或继承,这些语言之间就必需取得一个共同的subset,有共同遵守的规范,这就是CLS。
2)CLS通用语言规范(Common Language Specification)
很显然,编程语言的区别不仅仅在于类型。例如,一些语言支持多继承性,一些语言支持无符号数据类型,一些语言支持运算符重载。用户应认识到这一点,因此.NET通过定义公共语言规
范(CLS:Common Language Specification),限制了由这些不同引发的互操作性问题。CLS制定了一种以.NET平台为目标的语言所必须支持的最小特征,以及该语言与
其他.NET语言之间实现互操作性所需要的完备特征。认识到这点很重要,这里讨论的特征问题已不仅仅是语言间的简单语法区别。例如,CLS并不去关心一种语言用什么关键字实现继承
,只是关心该语言如何支持继承。CLS是CTS的一个子集。这就意味着一种语言特征可能符合CTS标准,但又超出CLS的范畴。例如:C#支持无符号数字类型,该特征能通过CTS的测试,
但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。
代码在默认.NET开发平台上是不会执行CLS检查的,如果要开启可以在AssemblyInfo.cs中加入代码 [assembly:System.CLSCompliant(true)]
实践:
例子一:C# 引用VB中的dll.(VB,C#类型满足CLS)
ClassLibrary1.Class1
编译后产生ClassLibrary1.dll.
在如下C#中添加该引用:
运行后输出t的值。
在此例子中,如果 将鼠标移至 test.Test1(), 然后右键 go to definition,会得到:
可以看出VB代码被转换成c# 代码。
待续。。。