** Managed Extensions Bring .NET CLR Support to C++中文版(上篇) **
作者: Chris Sells
译者:荣耀
【译注:以下是本译文中出现的部分名词术语英中对照表。但这并不意味我就一定将其译成中文,视乎语境,有时保留英文原词不译;并且,也不意味我以后一定这样翻译。】
** 英文 **
|
** 本文译法 **
|
** 说明 **
|
** 其它一些译法 **
---|---|---|---
managed
|
托管的
|
参照 VS Beta2
|
受控的、受管制的
unmanaged
|
非托管的
|
参照 VS Beta2
|
不受控的、不受管制的
attribute
|
特性
|
|
属性、属性信息
property
|
属性
|
此译法由来已久
|
特性
box(boxing)
|
装箱
|
|
unbox(unboxing)
|
拆箱
|
|
开箱
delegate
|
委托
|
|
代理、代表
assembly
|
配件
|
VS Beta2译为“程序集”
|
程序集、组合体、组件、部件
constructor
|
构造器
|
|
构造函数
destructor
|
析构器
|
|
析构函数
exception
|
异常
|
|
例外
namespace
|
名字空间
|
|
名称空间
indexer
|
索引器
|
|
索引函数
reflection
|
反射
|
|
映射
CLR(common language runtime)
|
公共语言运行时
|
|
公用语言运行期
garbage collection
|
垃圾收集
|
|
无用资源回收
garbage collector
|
垃圾收集器
|
|
无用资源回收程序
stack
|
栈
|
有个别新手并不清楚“堆栈”到底指“堆”还是“栈”
|
堆栈
heap
|
堆
|
|
【摘要:如果你是一个 C++老手,一开始你可能对向Visual Studio .NET迁移的念头警觉。然而,作为Visual C++的一个新特性—C++托管的扩展,为你提供了利用.NET框架创建应用的可能。当你使用managed C++时,你的代码被公共语言运行时(CLR)所管理,它提供了诸如垃圾收集、互操作能力以及更多的高级特性。本文解释了为什么你将愿意使用托管的扩展,怎样使用它们,如何混用托管的和非托管的代码,以及你的托管的代码如何能够同用其它语言编写的程序互操作】
C++语言已经存在好长时间了。它首先由Bjarne Stroustrup于1983年开发,后来于1997年被批准为ANSI标准。在那14年里,为了满足多种平台程序员社团要求,C++发生了很大进化。然而,即使在C++标准被批准之前,微软就开始扩展Visual C++,他们在每一个新版编译器里都加入了扩展,以满足以Windows为中心的程序员的特别需求。现在,随着Microsoft .NET的推广,微软C++编译器小组再一次使得C++程序员能够使用他们的语言去创建和使用新平台上的组件。然而,注意:这已不是你父亲时代的C++了,事情正在变得不同。
(还要注意的是,本文是基于可公开获得的.NET Framework SDK Beta1和Visual Studio .NET Beta1的。尽管概念应该相同,但.NET发行版和现在的版本肯定有变化。)
** .NET精华 **
作为一名Windows开发人员,除了了解新的.NET平台之外,别的什么也帮不了你。仅仅作为一个复习,.NET主要特性有:
1.具有丰富类型支持的简便的语言互操作能力,包括对跨语言继承、类型异常、构造器和公共基类的支持。
2.垃圾收集,提供最优化的自动内存管理。
3.强健的版本管理,同一组件的多种版本可以和平共处于同一机器上或同一进程中。
4.微软中间语言MSIL使得代码可以得到验证和重定向。
这些特性都为 .NET CLR所实现,它以独立组件方式提供了这些服务。(CLR是一个执行.NET组件的DLL。)组件自身包含元数据和实现,它是处理器相关的代码和IL的混合物。元数据提供了对语言互操作能力、垃圾收集、版本管理的支持,同时还支持IL和可验证性。
C#就是为了从根本上支持.NET所有主要特性而发明的,因此,对于它能够自然地处理它们也就不足为奇。例如,一个简单的C#类看起来如下:
// talker.cs
namespace MsdnMagSamples
{
public class Talker
{
public string Something = "something";
public void SaySomething() {System.Console.WriteLine(Something);}
}
}
可以这样编译该类(在一个名为talker.cs的文件里):
c:> csc /t:library /out:talker.dll talker.cs
你会注意到 C#酷似C++,除了一个非常重要的区别外:一旦我将类Talker编译成一个.NET配件(assembly)(粗略地说,是一个暴露.NET组件的DLL或EXE),将这个组件暴露给对其感兴趣的.NET客户(无论这些客户用何种语言实现)的全部必要条件就是在类前面加上一个public关键字,无需特定的入口点;也不必在.NET类型和C#类型之间做什么映射,被编译的组件提供了.NET运行时暴露类Talker所需要的所有元数据。例如,Visual Basic .NET客户可以如下方式使用元数据来访问类Talker:
'talkercli.vb
Public Module TalkerClient
Sub Main()
Dim t as new MsdnMagSamples.Talker
t.Something = "Hello, World"
t.SaySomething()
System.Console.WriteLine("Goodnight, Moon")
End Sub
End Module
可用如下命令行方式编译这个talkercli.vb文件:
c:> vbc /t:exe /out:talkercli.exe /r:talker.dll talkercli.vb
相形之下,就这么一个简单的移植—将 C#类Talker移植为C++ DLL,就甚至不能让其它C++客户去访问它(假如没有一些编译器技巧和前提的话),更不用说其他语言的客户了。不幸的是,C++程序员对这个特定限制早已见怪不怪。可以论证的是,整个Windows编程的历史就可以视为努力将一种语言编写的组件暴露给另一种语言客户的编年史。DLL使用C风格的函数,COM使用接口。对于C++程序员来说,实现DLL入口点不是一件舒服的事情,因为它感觉起来不够面向对象;另一方面,COM过量使用了面向对象,但除了接口外,没有什么类型是标准化的(译注:此句可疑),即使向COM客户暴露哪怕最简单的功能都会为C++程序员带来巨大的代码负担。
就象对 DLL和COM所做的一样,微软正持续进行多语言支持,他们向自己的语言里加入了对.NET的支持,并鼓励其他语言卖主也如此。你应能指望看到你的微软旧爱,如Visual Basic、C++和Jscript,以及大约两打的第三方和研究性的语言,将支持.NET。实际上,在上次PDC(译注:( 微软)职业开发者会议 )上,我就坐在一个正把 APL移植到.NET上的家伙的旁边。假如.NET连APL都打算支持了,你差不多可以确信你选择的语言也会跑到那儿了。
** Managed C++客户 **
当然,我所选择的语言是C++,微软使用一种名为C++托管的扩展的东西以在.NET上支持C++,更广为人知的说法是managed C++。在managed C++中,使用托管的扩展生成的代码和组件被CLR所管理,它们会被垃圾收集,具备版本管理功能,并能够访问其它托管的类型,等等。例如,一个简单的managed C++程序可以访问C# 类Talker,如你在表1所见。可以这样编译该类:
C:> cl /CLR talkcli.cpp /link /subsystem:console
** 表 1 ** ** 访问 C# 类Talker **
// talkercli.cpp
// Managed C++程序所必需
#using
1<mscorlib.dll>
2
3// 引入类Talker
4
5#using <talker.dll>
6
7using namespace MsdnMagSamples;
8
9void main()
10
11{
12
13Talker* t = new Talker();
14
15t->Something = S"Hello, World";
16
17t->SaySomething();
18
19System::Console::WriteLine(S"Goodnight, Moon");
20
21}
22
23---
24
25** 表 2 新的managed C++关键字和指示符 **
26
27---
28
29** 关键字 **
30
31|
32
33** 描述 **
34
35__abstract
36
37|
38
39声明一个不可直接实例化的类, Managed 接口内在地为抽象的
40
41<TD style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95.4pt; PA</talker.dll></mscorlib.dll>