的C++类,而代码:
__gc class MyClass
{
生成了一个托管类,就好像使用C#或VB.NET编写类一样。实际上,托管C++比C#更优越的一点是可以在托管C++代码中调用非托管C++类,而不必采用COM交互功能。
如果在托管类型上试图使用.NET不支持的特性(例如,模板或类的多继承),编译器就会出现一个错误。另外,在使用托管类时,还需要使用非标准的C++特
性(例如上述代码中的__gc关键字)。
因为C++允许低级指针操作,C++编译器不能生成可以通过CLR内存类型安全测试的代码。如果CLR把代码标识为内存类型安全是非常重要的,就需要用其他一些语言编写源代码,例如C# 或VB.NET。
Visual J#
。在.NET Framework 1.1版本推出之前,用户必须下载相应的
软件,才能使用J#。现在J#语言内置于.NET Framework中。因此,J#用户可以利用Visual Studio .NET的所有常见特性。Microsoft希望大多数J++用户认为他们在使用.NET时,将很容易使用J#。J#不使用Java运行库,而是使用与其他.NET兼容语言一样的基类库。这说明,与C#和VB.NET一样,可以使用J#创建ASP.NET Web应用程序、Windows窗体、XML Web服务和其他应用程序。
脚本语言
的推出,一般认为它们的重要性在降低。另一方面,JScript升级到JScript.NET。ASP.NET页面可以用JScript.NET编写,现在可以把JScript.NET当作一种编译语言来运行,而不是解释性的语言,也可以编写输入量比较大的JScript.NET代码。有了ASP.NET后,就没有必要在服务器端的Web页面上使用脚本语言了,但VBA仍用作Office
文档和Visual Studio宏语言。
COM和COM+
从技术上讲,COM 和 COM+并不是面向.NET的技术,因为基于它们的组件不能编译为IL(但如果原来的COM组件是用C++编写的,使用托管C++,在某种程度上可以这么做)。但是,COM+仍然是一个重要的工具,因为其特性没有在.NET中完全实现。另外,COM组件仍可以使用——.NET组合了COM的互操作性,从而使托管代码可以调用COM组件,COM组件也可以调用托管代码(见第29章)。在大多数情况中,把新组件编写为.NET组件,其多数目的是为了比较方便,因为这样可以利用.NET基类和托管代码的其他优点。
1.3 中间语言
中有非常重要的作用。C#开发人员应明白,C#代码在执行前要编译为中间语言(实际上,C#编译器仅编译为托管代码),这是有意义的,现在应详细讨论一下IL的主要特征,因为面向.NET的所有语言在逻辑上都需要支持IL的主要特征。
下面就是中间语言的主要特征:
● 面向对象和使用接口
● 值类型和引用类型之间的巨大差别
● 强数据类型
● 使用异常来处理错误
● 使用特性(attribute)
下面详细讨论这些特征。
1.3.1 面向对象和接口的支持
.NET的语言无关性还有一些实际的限制。特别是中间语言在设计时就打算实现某些特殊的编程方法,这表示.NET语言必须与编程方法兼容,Microsoft为IL选择的特定道路是传统的面向对象的编程,带有类的单一继承性。
注意:
不熟悉面向对象功能概念的读者应参考附录A,获得更多的信息。附录A可以从wrox上下载。
除了传统的
面向对象编程外,中间语言还引入了接口的概念,它们显示了在带有COM的Windows下的第一个实现方式。.NET接口与COM接口不同,它们不需要支持任何COM基础结构,例如,它们不是派生自IUnknown,也没有对应的GUID。但它们与COM接口共享下述理念:提供一个契约,实现给定接口的类必须提供该接口指定的方法和属性的实现方式。
面向对象和语言的互操作性
前面介绍了使用.NET意味着要编译为中间语言,即需要使用传统的面向对象的方法来编程。但这并不能提供语言的互操作性。毕竟,C++和Java都使用相同的面向对象的范型,但它们仍不是可交互操作的语言。下面需要详细探讨一下语言互操