用于COM聚集的受保护和虚拟接口转让专利

申请号 : CN201110436082.0

文献号 : CN102609300B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : M·J·希尔贝里S·S·帕里克

申请人 : 微软公司

摘要 :

本发明涉及用于COM聚集的受保护和虚拟接口。可向外COM对象提供对内COM对象中的受保护功能的特权访问。内COM对象可通过创建对于调用应用不可用的新的内内部COM对象或者通过创建可用于访问受保护内容的新的扩展IUnknown接口来向外COM对象提供定制受保护接口。外COM对象可覆盖内COM对象中的行为。内COM对象可通过创建对于调用应用不可用的新内内部COM对象来向外COM对象提供对定制行为的访问。该新内内部COM对象可实现提供对定制(覆盖)内容的访问的新接口,或者可创建可用于提供对定制(覆盖)内容的访问的新扩展IUnknown接口。

权利要求 :

1.一种用于创建COM聚集的受保护和虚拟接口的方法,包括:创建外COM对象(150),所述外COM对象(150)聚集内COM对象(152);

创建所述内COM对象(152);

从所述外COM对象(150)向所述内COM对象(152)传递控制未知对象(170);

由所述外COM对象(150)从所述内COM对象(152)接收非委托未知对象(156);

从所述外COM对象(150)向所述内COM对象(152)传递控制内部COM对象(160);

从所述内COM对象(152)向所述外COM对象(150)返回内内部COM对象(162);以及接收创建所述内COM对象(152)的接口(184)的请求,所述接口(184)不能被调用应用访问但所述接口(184)能被所述外COM对象(150)访问。

2.如权利要求1所述的方法,其特征在于,所述内内部COM对象实现受保护接口,所述受保护接口包括不能被所述调用应用访问但能被所述外COM对象访问的接口。

3.如权利要求1所述的方法,其特征在于,所述内内部COM对象定义覆盖接口,且其中所述内内部COM对象查询由所述内内部COM对象定义的所述覆盖接口的控制内部对象。

4.如权利要求3所述的方法,其特征在于,外内部COM对象实现能被所述内COM对象访问的接口,该接口通过提供其自己的行为实现来覆盖所述内COM对象的行为。

5.如权利要求1所述的方法,其特征在于,外内部COM对象实现能被所述内COM对象访问的接口,该接口覆盖所述内COM对象的行为并且还调用进入所述内COM对象。

6.如权利要求1所述的方法,其特征在于,所述外COM对象使用所述内内部对象来请求所述内COM对象的受保护接口。

7.如权利要求1所述的方法,其特征在于,所述外COM对象接收所述内COM对象的受保护接口并使用所述内COM对象的所述受保护接口来调用所述内COM对象的受保护功能子集。

8.一种用于创建COM聚集的受保护和虚拟接口的方法,包括:接收创建外COM对象的请求(202);

创建所述外COM对象,所述外COM对象聚集内COM对象(204);

创建所述内COM对象(205);

从所述外COM对象向所述内COM对象传递对内部IUnknown接口的扩展(208);以及由所述外COM对象从所述内COM对象接收对内部IUnknown接口的扩展(208)。

9.如权利要求8所述的方法,其特征在于,所述内COM对象向所述外COM对象提供对所述内COM对象的功能子集的专用访问,其中所述功能子集包括受保护内容。

10.一种用于创建COM聚集的受保护和虚拟接口的系统,包括:用于接收创建外COM对象的请求的装置;

用于创建所述外COM对象的装置,所述外COM对象聚集内COM对象;

用于创建所述内COM对象的装置;

用于从所述外COM对象向所述内COM对象传递对内部IUnknown接口的扩展的装置;以及用于由所述外COM对象从所述内COM对象接收对内部IUnknown接口的扩展的装置。

说明书 :

用于COM聚集的受保护和虚拟接口

技术领域

[0001] 本发明涉及用于COM聚集的受保护和虚拟接口。

背景技术

[0002] 面向对象编程语言中的“对象”是代码和相关数据(称为对象的方法和属性)的封装模块,其可由客户机通过接口来访问,这些接口访问良好定义且受控的连接点。可创建对象的集合以执行计算机应用中需要的功能。
[0003] 组件对象模型(COM)是一种软件组件的二进制接口标准,用于以支持它的任何编程语言来实现通信和动态对象创建。术语COM在软件开发世界中常常被用作涵盖OLE、OLE自动化、 COM+以及DCOM技术的总括术语。COM提供实现对象的语言中立方式,从而对象可在与创建该对象的环境不同的环境中使用。
[0004] 在COM中实现对象重用的一种机制是包容委托。包容委托是一种其中一个对象(“外”对象)使用另一对象(“内”对象)的功能来向外对象的客户机提供接口实现的机制。外对象“包含”内对象。外对象向客户机展示接口,但这些接口属性和方法中的某些的实现显式地委托给内对象的方法。外对象的包容可通过外对象创建其使用的内对象来实现;使用其指向内对象的指针,对外对象中的方法的调用产生对内对象中的方法的调用。
[0005] COM聚集是COM对象的包容委托的扩展,其中外对象展示来自内对象的接口,就像这些接口是在外对象自身上实现的一样。即,当外对象的客户机请求接口时,若外对象不具有该接口的实现,则其将该请求转发给内对象。若内对象返回接口,则外对象的客户机随后直接向该内对象作出方法和属性调用。注意,内对象自身可以是第三对象的外对象,且可类似地转发接口请求。最外对象被称为“控制”对象。若客户机正与内对象交互并请求新接口,则该内对象将该请求转发给控制对象,从而外对象有机会在内对象之前回答请求。该聚集算法在外对象将对其接口之一的所有调用委托给内对象中的相同接口时可能是有用的。在该情形中,COM聚集可避免外对象中的额外实现开销。

发明内容

[0006] COM聚集不定义外对象的模式以具有对某些内对象接口的受保护访问。例如,内对象可具有其希望展示给外对象但不希望展示给控制对象的客户机的接口。COM聚集不定义内对象的模式以允许其方法和属性实现中的一些被外对象覆盖。例如,内对象可具有方法,内对象希望给予外对象针对该方法的行为提供替换行为的能力。
[0007] 可向外COM对象提供对内COM对象中的受保护功能的访问,该功能不被展示给控制对象的客户机。在一种办法中,内COM对象通过向外对象提供新的“受保护”内部接口来将该受保护接口提供给外COM对象,该新的“受保护”内部接口与外对象在COM聚集中保持的标准内部接口分开。如同COM中的所有接口一样,受保护内部接口可用于请求其它接口。但是,外对象从内对象接收的标准内部接口只能用于请求不受保护的(“公共”)接口,受保护内部接口可用于请求受保护接口。当外对象将来自控制对象的客户机的接口请求委托给内对象时,被委托的接口请求仅被发送给标准内部接口,且因此控制对象的客户机被阻止访问受保护接口。当外对象希望访问受保护功能时,外对象向受保护内部接口请求受保护接口。在替换办法中,内对象如同标准COM聚集中一样向外对象提供单个接口,其为内部接口。从该内部接口仅可作出对公共接口的请求,且当外对象委托来自控制对象的客户机的接口请求时,其请求公共接口。但该内部接口也可用于请求内对象的受保护接口,外对象使用此举来调用受保护接口。控制对象的客户机不被给予对受保护接口的访问。
[0008] 外COM对象可覆盖内COM对象中的行为。内对象通过为此定义新覆盖接口并从控制对象请求新覆盖接口来使得该能力变为可能。这允许控制对象或某个其它外对象提供所请求接口。若没有外对象实现此覆盖接口,则接口请求反过来委托给原始内对象,以使得该内对象最终调用其自己的实现。若内对象旨在使可覆盖接口成为公共的(对于控制对象的客户机可用),则作出标准接口请求。即,当内对象(或任何其它代码)希望调用可覆盖方法时,其使用标准接口请求从控制对象请求该接口。内对象还可使可覆盖接口受保护,如前一段中描述的。在这种情形中,在一种办法中,外COM对象向内对象提供受保护的可覆盖内部接口。当内对象从控制对象请求覆盖接口时,该请求在该受保护的可覆盖内部接口上发送。当外对象将该接口请求委托给内对象时,其使用内对象的受保护内部接口来这样做,如前一段的第一种办法中描述的。在替换办法中,外对象如同标准COM聚集办法中一样向内对象提供单个接口,其为内部接口。从该接口可作出对公共接口或受保护接口的请求。当内对象希望调用可覆盖方法时,其在该内部接口上向控制对象作出请求。当外对象将该接口请求委托给内对象时,其再次使用该内部接口来这样做,如前一段的第二种办法中描述的。
[0009] 提供本发明内容以便以简化的形式介绍将在以下具体实施方式中进一步描述的一些概念。本发明内容并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制所要求保护主题的范围。

附图说明

[0010] 在附图中:
[0011] 图1a示出了根据本文所公开主题的各方面的用于创建COM聚集的受保护和/或虚拟接口的系统100的示例;
[0012] 图1b示出了根据本文所公开主题的各方面的用于创建COM聚集的受保护和/或虚拟接口的模型的示例的说明;
[0013] 图2是根据本文所公开主题的各方面的用于在计算机上创建COM聚集的受保护和/或虚拟接口的方法200的示例的流程图;
[0014] 图3是根据本文所公开主题的各方面的计算环境的示例的框图;以及[0015] 图4是根据本文所公开主题的各方面的集成开发环境的示例的框图。

具体实施方式

[0016] 概览
[0017] COM对象实现IUnknown接口以及实现IUnknown接口方法的其它接口。IUnknown接口展示三种方法:QueryInterface(查询接口)、AddRef(添加引用)和Release(释放)。QueryInterface用于在标识符调用标识想要的接口的GUID(全局唯一标识符)的情况下获得指向另一接口的指针。AddRef由一个或多个客户机(例如,应用)用于指示COM对象正被引用。AddRef随着作出的每个引用而递增,从而COM对象不会被过早移除。Release由客户机用于指示该客户机已完成使用该COM对象。未被引用的COM对象可被安全地移除。
COM对象的聚集使用内对象上的IUnknown的特殊“非委托”实现,该内对象将对未知接口的QueryInterface请求转发给其自己的内对象(若存在)。另外,内对象上任何其它接口的IUnknown方法委托给外“控制”对象的IUnknown方法。传统的COM聚集允许对象创建内对象但不描述外(聚集器)COM对象具有特权访问内(被聚集)COM对象中的受保护功能的方式。COM聚集也不描述外对象覆盖(override)内对象的行为的方式。
[0018] 根据本文所公开主题的各方面,提供了允许内COM对象向外COM对象提供对内COM对象的功能子集的专用访问的机制。外COM对象可接收来自内COM对象的专用回调。外COM对象可通过定义新接口和运行时类来向调用应用提供附加功能。
[0019] 用于COM聚集的受保护和虚拟接口
[0020] 在包括C++在内的某些编程语言中,基类可定义受保护和虚拟成员。派生类可调用受保护成员,并且可覆盖虚拟成员。这在下列代码片段中说明:
[0021]
[0022]
[0023] 在以上复制的C++程序代码中,名为CButton的类上存在称为OnClick的受保护(protected)虚拟方法。当该Cbutton类的实现通过某种方式确定其已被“按压”时,其调用该OnClick方法。由于CButton的OnClick方法是虚拟的且被CMyButton中的OnClick方法覆盖,因此实际上是CMyButton的OnClick方法被调用。这些方法示例中的“...”指示此处可以包括或可以不包括某些其它程序指令。CMyButton::OnClick可执行其希望的代码,包括调用可能已被调用的CButton::OnClick方法——倘若其未被CMyButton覆盖。使用C++的人常常将这两种能力称为“能够覆盖虚拟方法”和“能够调用直至基”。该示例中还示出了关于CButton:OnClick和SetButtonContent的两种受保护方法。由于这些方法具有受保护访问,因此它们典型地仅可被CButton类中的代码或被诸如CMyButton等派生类中的代码调用。
[0024] 若该示例是使用COM聚集实现的,则目前没有描述CButton对象的接口(例如,IButton接口)保持SetButtonContent方法受保护的方式,且没有至CMyButton对象的接口(例如,实现IMyButton接口的接口)覆盖CButton的OnClick方法的方式。根据本文所公开主题的各方面,提供了使得能实现被聚集COM对象中的受保护方法和虚拟方法的新COM接口。将明白,在所提供的示例中,虚拟方法也是受保护方法,但是将明白,虚拟方法也可以是不受保护的方法。
[0025] 在该示例中,这些对象的COM实现可具有下列接口:
[0026]
[0027]
[0028] 假设CButton实现两个接口:不受保护的接口IButton和受保护接口IButtonProtected,以及公共或受保护接口IButtonOverride。CButton可被实现为在被指示时调用IButtonOverride。IButtonOverride也可由CMyButton实现。根据本文所公开主题的各方面,以上实现可通过经由创建新对象以创建新接口或通过仅创建作为IUknown接口的扩展的新接口来完成。
[0029] 图1a示出了根据本文所公开主题的各方面的用于创建COM聚集的受保护和/或虚拟接口的系统100的示例。系统100的全部或某些部分可以驻留在诸如下面参考图3所描述的计算机之类的一台或多台计算机上。系统100的全部或部分可驻留在诸如以下参照图4描述的计算机之类的一个或多个软件开发计算机上。系统100或其一些部分可以包括诸如下面参考图4所描述的和所示出的那些集成开发环境(IDE)的一部分。或者,系统100可存在于IDE外。系统100或其部分可以被提供为独立系统或插件或附件。
[0030] 系统100可包括一个或多个计算机102,计算机102包括处理器(诸如处理器142)、存储器(诸如存储器144)、以及用于创建COM聚集的受保护和/或虚拟接口的一个或多个模块(诸如模块106)等。也可以包括本领域已知的其他组件,但此处未示出。将明白,(例如,实现COM聚集的受保护和/或虚拟接口的)一个或多个模块(诸如模块106)等可被加载到存储器144中以使得诸如处理器142等一个或多个处理器能执行归于用于创建COM聚集的受保护和/或虚拟接口的一个或多个模块的动作。
[0031] 在操作中,开发者向编辑器116中输入源代码108,模块106等对源代码108进行动作以创建一个或多个COM对象(诸如COM对象114)和/或一个或多个COM对象接口(诸如COM对象接口112),如以下更全面描述的。模块106等可以是编译器110的模块,或者可以是插件,或者可以与编译器110分开。模块106等和/或编译器110可生成一个或多个COM对象(诸如COM对象114)和/或一个或多个COM对象接口(诸如COM对象接口112)。在运行时期间,如以下描述的COM对象和接口可以动态地生成。
[0032] 图1b示出用于创建COM聚集的受保护和/或虚拟接口的对象分开办法。在图1b中,COM对象A 154(最内对象)是由COM对象B 152聚集的。COM对象B 152包容或聚集COM对象A 154,且COM对象B 152被COM对象C150包容或聚集。虽然图1b中示出三个COM对象,但是将明白,本文中所描述的主题等同地适用于两个COM对象或三个以上COM对象。COM对象C 150是COM对象B 152的外对象,而COM对象B 152是COM对象A 154的外对象。因此,COM对象B 152既是外对象也是内对象。COM对象A 154是COM对象B 152的内对象。COM对象B是COM对象C 150的内对象。COM对象C 150是控制对象。COM对象C 150展示接口ICOMObjectCInterface 166以及控制IUnknown接口ICOMObjectCIUnknownInterface 168。COM对象B 152展示委托接口ICOMObjectBInterface 174以及非委托IUnknown接口ICOMObjectBNDIUnknownInterface170。COM对象A 154展示委托接口ICOMObjectAInterface176以及非委托IUnknown接口ICOMObjectANDIUnknownInterface 172。COM对象C 150是最外对象。最外对象传递其自身作为控制未知接口和控制内部接口。
[0033] 根据已知的COM聚集能力,若调用应用调用COM对象C 150的接口上( 例 如,ICOMObjectCIUnknownInterface 168 上 ) 的 QueryInterface 方 法, 则ICOMObjectBInterface 174将被返回给该应用。COM对象C 150能够使用非委托IUnknown接口ICOMObjectBIUnknownInterface 170调用进入COM对象B152。这种情形能够发生是由于当COM对象C 150创建COM对象B 152时,COM对象C 150向COM对象B 152传递了控制未知对象接口(ICOMObjectCIUnknownInterface 168)。作为响应,COM对象B 152向COM对象C 150传递回非委托未知接口ICOMObjectBNDIUnknownInterface170。此外,若调用应用(控制COM对象即COM对象C 150的客户机)调用由COM对象C 150实现的接口上的QueryInterface方法,则COM对象C 150将向COM对象B 152发出调用,且COM对象B 152将向COM对象A 154发出调用以询问接口。COM对象A 154可向COM对象B 152返回例如ICOMObjectAInterface 176。COM对象B 152随后可向COM对象C 150返回ICOMObjectAInterface 176。这种情形能够发生是由于当COM对象B 152创建COM对象A 154时,COM对象B 152向COM对象A 154传递了控制未知接口(ICOMObjectCIUnknownInterface 168)。作为响应,COM对象A 154向COM对象B 152传递回非委托未知接口ICOMObjectANDIUnknownInterface172。
[0034] 根据本文所公开主题的各方面,当外COM对象创建内COM对象时,除了向内COM对象传递控制未知对象以外,外COM对象还向内COM对象传递控制内部对象。响应于接收到控制内部对象,内COM对象向外COM对象传递内内部对象。控制内部对象和内内部对象可实现受保护接口和/或覆盖接口。若对象被创建但未被传递控制内部对象,则所创建的对象不返回内内部对象。
[0035] 例如,再次参考图1b,当COM对象C 150创建COM对象B 152时,除了向COM对象B152传递控制未知接口(例如,ICOMObjectCIUnknownInterface 168)以外,COM对象C150还向COM对象B 152传递控制内部接口,诸如ICOMObjectAOverride 180、用于COM对象C内部对象160的IUnknown接口等。作为响应,COM对象B 152向COM对象C 150传递回用于COM对象B内内部对象162的内内部接口,诸如ICOMObjectBOverride 186等。COM对象B内内部对象162可实现受保护和覆盖接口,诸如ICOMObjectBProtected 184和/或ICOMObjectBOverride 182。将明白,覆盖接口可以是受保护的或公共的。公共覆盖接口可通过使覆盖接口位于常规对象上而非内部对象上来实现。例如,公共覆盖接口可被置于COM对象B 152上而非COM对象B内内部对象162上。
[0036] 使用这种对象创建模式,应用针对覆盖或受保护接口调用外对象的QueryInterface方法 以获 取该 对 象上 的任 何接 口将 失 败。例 如,针 对ICOMObjectBProtected 184调用ICOMObjectCInterface 166的QueryInterface方法将失败。然而,由于外对象能访问内对象的内部对象,因此外对象能访问受保护和/或覆盖接口。例如,由于COM对象C 150能访问COM对象B 152的内内部对象即COM对象B内内部对象162,因此COM对象C 150能访问COM对象B 152的任何受保护和/或覆盖接口。COM对象C 150能访问COM对象B152的内内部对象即COM对象B内内部对象162是由于在COM对象B 152的创建期间,COM对象B 152向COM对象C 150传递了其ICOMObjectBProtected
184接口。因此,COM对象C 150能访问COM对象B152的任何受保护和/或覆盖接口。此外,每个内部对象能访问最外或控制内部对象。
[0037] 例如,假设COM对象A 154(最内对象)想要访问ICOMObjectAOverride。ICOMObjectAOverride可实现 在COM对象C 150上 和/或COM对象B 152 上。COM对象A 154可调用由COM对象C实现的控制内部对象(例如,COM对象C内部对
象160)上的QueryInterface。若由COM对象C 150实现覆盖方法,则COM对象C的ICOMObjectAOverride180返回其自身。若ICOMObjectAOverride不是在COM对象C中实现的,则对QueryInterface的调用被委托给由COM对象B 152实现的COM内内部对象,给予COM对象B 152返回其ICOMObjectBOverride 182的机会等等。这对于COM对象B的覆盖接口ICOMObjectBOverride 178和ICOMObjectBOverride 186和受保护接口(诸如ICOMObjectBProtected 184)以及COM对象A内内部对象164的受保护接口ICOMObjectAProtected 188类似地成立。
[0038] 在接口分开办法中,不创建用于受保护内部接口的单独对象和/或不创建用于覆盖内部接口的单独对象。相反,根据本文所公开主题的各方面,创建新扩展IUnknown接口,其可用于访问这些接口:
[0039]
[0040]
[0041] 在创建内对象时,控制内部接口(例如,IInternalInterface)可被传递给内对象,并且内内部接口(例如,IInternalInterface)可被返回。若对象被创建但未被传递控制内部接口(例如,IInternalInterface),则类似地,IInternalInterface不被返回。
[0042] IInternalInterface::QueryInternalInterface可被查询以获得对象的受保护接口。若外对象经由其IInternalInterface::QueryInternalInterface方法被查询以获得其不支持的接口,则其将查询请求转发给内对象的IInternalInterface::QueryInternalInterface。可查询QueryInternalInterface(查询内部接口)以获得任何接口,但不能查询对象的QueryInterface以获得受保护接口。例如,可查询COM对象C的QueryInterface和QueryInternalInterface以获得ICOMObjectC,但仅能查询QueryInternalInterface以获得ICOMObjectBOverride。IInternalInterface::QueryInterface返回IUnknown的公共接口。
[0043] 图2示出了根据本文所公开主题的各方面的用于创建COM聚集的受保护和/或虚拟接口的方法200的示例。图2中所述的方法可由诸如但不限于图1a中所述的系统来实践。以下描述的一些动作可以是可任选的。以下描述的一些动作可按不同于以下所述的序列来执行。
[0044] 在202,接收创建对象的请求。在204,外对象创建内对象。在206,外对象向内对象传递控制未知接口。在208,外对象接收从内对象返回的非委托未知接口。在212,外对象向内对象传递控制内部接口。在214,外对象接收从内对象返回的内内部接口。
[0045] 合适计算环境的示例
[0046] 为了提供有关本文所公开主题的各方面的上下文,图3以及以下讨论旨在提供其中可以实现本文所公开主题的各实施例的合适计算环境510的简要概括描述。尽管本文所公开的主题是在诸如程序模块等由一个或多个计算机或其它计算设备执行的计算机可执行指令的通用上下文中描述的,但本领域技术人员将认识到,本文所公开的主题的各部分还能够结合其它程序模块和/或硬件和软件的组合来实现。通常,程序模块包括执行特定任务或实现特定数据类型的例程、程序、对象、物理人为产物、数据结构等。通常,程序模块的功能可在各个实施例中按需进行组合或分布。计算环境510只是合适的操作环境的一个示例,并且不旨在对此处所公开的主题的使用范围或功能提出任何限制。
[0047] 参考图3,描述了计算机512形式的计算设备。计算机512可包括处理单元514、系统存储器516和系统总线518。处理单元514可以是各种可用处理器中的任何一种。也可以使用双微处理器及其他多处理器体系结构作为处理单元514。系统存储器516可包括易失性存储器520和非易失性存储器522。非易失性存储器522可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)或闪存。易失性存储器520可包括可充当外高速缓冲存储器的随机存取存储器(RAM)。系统总线518将包括系统存储器516的系统物理人为产物耦合到处理单元514。系统总线518可以是几种类型的总线结构中的任何一种,包括存储器总线、存储控制器、外围总线、外总线或局部总线,并且可以使用各种可用总线体系结构中的任一种。
[0048] 计算机512通常包括各种计算机可读介质,诸如易失性和非易失性介质、可移动和不可移动介质。计算机存储介质可以通过用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术来实现。计算机存储介质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CDROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机512访问的任何其他瞬态或非瞬态介质。
[0049] 将理解,图3描述了可充当用户与计算机资源之间的媒介的软件。该软件可以包括可存储在盘存储524上的操作系统528,该操作系统可控制对象A(最内对象)并分配计算机系统512的资源。盘存储524可以是通过诸如接口526的不可移动存储器接口连接到系统总线518的硬盘驱动器。系统应用530利用由操作系统528通过存储在系统存储器516中或者存储在盘存储524上的程序模块532和程序数据534对资源的管理。应该明白,计算机可用各种操作系统或操作系统的组合来实现。
[0050] 用户可通过输入设备536向计算机512输入命令或信息。输入设备536包括但不限于定点设备,诸如鼠标、跟踪球、指示笔、触摸垫、键盘、话筒等。这些及其他输入设备通过系统总线518经由接口端口538连接到处理单元514。接口端口538可表示串行端口、并行端口、通用串行总线(USB)等。输出设备540可与输入设备使用相同类型的端口。提供输出适配器542以举例说明存在像监视器、扬声器、以及打印机的需要特定适配器的一些输出设备540。输出适配器542包括但不限于,在输出设备540和系统总线518之间提供连接的视频卡和声卡。其他设备和/或设备系统,诸如远程计算机544,可提供输入和输出两种能力。
[0051] 计算机512可以使用到诸如远程计算机544之类的一个或多个远程计算机的逻辑连接来在联网环境中操作。远程计算机544可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见的网络节点,并且通常包括许多或所有以上相对于计算机512所描述的元件,尽管在图3中仅示出了存储器存储设备546。远程计算机544可经由通信连接550逻辑地连接。网络接口548涵盖诸如局域网(LAN)和广域网(WAN)这样的通信网络,但也可包括其他网络。通信连接550是指用来将网络接口548连接到总线518的硬件/软件。连接550可以在计算机512内或外并且包括诸如调制解调器(电话、电缆、DSL和无线)和ISDN适配器、以太网卡等内和外技术。
[0052] 应该理解,所示网络连接仅是示例,并且可以使用在计算机之间建立通信链路的其它手段。本领域的普通技术人员可以理解,计算机512或其它客户机设备可作为计算机网络的一部分来部署。在这一点上,本文所公开的主题涉及具有任意数量的存储器或存储单元以及在任意数量的存储单元或卷上发生的任意数量的应用和进程的任何计算机系统。本文所公开的主题的各方面可应用于具有部署在网络环境中的具有远程或本地存储的服务器计算机和客户计算机的环境。本文所公开的主题的各方面也可应用于具有编程语言功能、解释和执行能力的独立计算设备。
[0053] 图4示出集成开发环境(IDE)600和通用语言运行时环境602。IDE 600可允许用户(例如,开发者、程序员、设计者、编码者等)在计算机系统中设计、编码、编译、测试、运行、编辑、调试或构建程序、程序集、网站、web应用和web服务。软件程序可以包括在一个或多个源代码语言(例如,Visual Basic、Visual J#、C++、C#、J#、Java Script、APL、COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl、Python、Scheme、Smalltalk等等)中创建的源代码(组件610)。IDE 600可提供本机代码开发环境,或者可提供在虚拟机上运行的托管代码开发,或者可提供其组合。IDE 600可提供使用.NET框架的托管代码开发环境。可使用语言专用源编译器620从源代码组件610和本机代码组件611创建中间语言组件650,并且在执行应用时使用中间语言编译器660(例如,即时(JIT)编译器)从中间语言组件650创建本机代码组件611(例如,机器可执行指令)。即,当IL应用被执行时,其在被执行的同时被编译成适合正在其上执行它的平台的合适机器语言,藉此使代码能跨若干平台便携。或者,在其他实施例中,程序可被编译成适合其目标平台的本机代码机器语言(未示出)。
[0054] 用户可根据已知软件编程技术以及与特定源语言相关联的特定逻辑和句法规则经由IDE 600中的用户接口640和源代码编辑器651来创建和/或编辑源代码组件。此后,源代码组件610可经由源编译器620被编译,藉此可创建该程序的中间语言表示,诸如汇编630。汇编630可包括中间语言组件650和元数据642。
[0055] 应用设计可以能够在部署前被验证。
[0056] 本文所述的各种技术可结合硬件或软件,或在适当时以其组合来实现。由此,本文所公开的方法和装置或其特定方面或部分可采取包含在诸如软盘、CD-ROM、硬盘驱动器或任何其它机器可读存储介质等有形介质中的程序代码(即,指令)的形式,其中当程序代码被加载到诸如计算机等机器内并由其执行时,该机器成为用于实现本文所公开的主题的各方面的装置。在程序代码在可编程计算机上执行的情况下,计算设备通常将包括处理器、该处理器可读的存储介质(包括易失性和非易失性的存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设备。可例如通过使用数据处理API等来利用域专用编程模型各方面的创建和/或实现的一个或多个程序可用高级过程语言或面向对象的编程语言来实现以与计算机系统通信。然而,如果需要,该程序可以用汇编语言或机器语言来实现。在任何情形中,语言可以是编译语言或解释语言,且与硬件实现相结合。
[0057] 虽然已结合附图描述了本文所公开的主题,但是应理解,可作出修改以按不同方式执行相同功能。