M.E. Bring .NET CLR Support to C++中文版(上篇)

来源:互联网 发布:linux find mtime rm 编辑:程序博客网 时间:2024/05/12 14:46
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

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 <mscorlib.dll>

// 引入类Talker

#using <talker.dll>

using namespace MsdnMagSamples;

void main()

{

Talker* t = new Talker();

   t->Something = S"Hello, World";

   t->SaySomething(); 

   System::Console::WriteLine(S"Goodnight, Moon");

}

    

2 新的managed C++关键字和指示符

关键字

描述

__abstract

声明一个不可直接实例化的类,Managed 接口内在地为抽象的

__box

为值类型创建一个引用类型的拷贝

__delegate

可以绑定于实例方法或静态方法的“函数指针”

__event

toP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTtoM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 330.7pt; PADDING-toP: 0cm; BORDER<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击