作性的概念。
首先,需要确定一下语言互操作性的含义。毕竟,COM允许以不同语言编写的组件一起工作,即可以调用彼此的方法。这就足够了吗?COM是一个二进制标准,允许组件实例化其他组件,调用它们的方法或属性,而无需考虑编写相关组件的语言。但为了实现这个功能,每个对象都必须通过COM运行库来实例化,通过接口来访问。根据关系组件的线程模型,不同线程上内存空间和运行组件之间要编组数据,这还可能造成很大的性能损失。在极端情况下,组件驻留在可执行文件中,而不是DLL文件中,还必须创建单独的过程来运行它们。重要的是组件要能与其他组件通信,但仅通过COM运行库进行通信。无论COM是用于允许使用不同语言的组件直接彼此
通信,或者创建彼此的实例,
系统都把COM作为中间件来处理。不仅如此,COM结构还不允许利用继承实现,即它丧失了面向对象编程的许多优势。
一个相关的问题是,在调试时,仍必须单独调试用不同语言编写的组件。这样就不可能在调试器上调试不同语言的代码了。语言互操作性的真正含义是用一种语言编写的类应能直接与用另一种语言编写的类通信。特别是:
● 用一种语言编写的类应能继承用另一种语言编写的类。
● 一个类应能包含另一个类的实例,而不管它们是使用什么语言编写的。
● 一个对象应能直接调用用其他语言编写的另一个对象的方法。
● 对象(或对象的引用)应能在方法之间传递。
● 在不同的语言之间调用方法时,应能在调试器中调试这些方法调用,即调试不同语言编写的源代码。
这是一个雄心勃勃的目标,但令人惊讶的是,.NET和中间语言已经实现了这个目标。在调试器上调试方法时,Visual Studio .NET IDE提供了这样的工具(不是CLR提供的)。
1.3.2 值类型和引用类型
与其他编程语言一样,中间语言提供了许多预定义的基本数据类型。它的一个特性是值类型和引用类型有明
显的区别。对于值类型,变量直接保存其数据,而对于引用类型,变量仅保存地址,对应的数据可以在该地址中找到。
在C++中,引用类型类似于通过指针来访问变量,而在Visual Basic中,与引用类型最相似的是对象,VB6总是通过引用来访问对象。中间语言也有数据存储的规范:引用类型的实例总是存储在一个名为托管堆的内存区域中,值类型一般存储在堆栈中(但如果值类型在引用类型中声明为字段,它们就内联存储在堆中)。第3章讨论堆栈和堆,及其工作原理。
1.3.3 强数据类型
中间语言的一个重要方面是它基于强数据类型。所有的变量都清晰地标记为属于某个特定数据类型(在中间语言中没有Visual Basic和脚本语言识别的Variant数据类型)。特别是中间语言一般不允许对模糊的数