体验Visual C++ 2005的现代语言特性(3)

It Just Works

  在Visual Studio .NET 2003,C++的interop技术叫做IJW或者“It Just Works”,在新版本中,已换成了更贴切的“Interop技术”。那它的工作原理是怎样的呢?对程序中的每一个本地方法,编译器同时生成一个托管和非托管进入点,它们中只有一个是真正方法的实现,另一个则是转发器,可进行相应的转换和必要的调度。托管进入点通常是真正方法的实现,除非代码不能解释为MSIL或开发者使用“#pragma unmanaged”强制指定进入点的实现为本地机器码。

  当一个IJW转发器起作用时——例如转发到本地代码中,编译器提供转换的实现,并且通过偏移或IAT(Import Address Table)调用实际的实现代码;虽然针对特别开发的示例程序,转发器的一次调用所耗费的时钟周期可降到10,但通常来说,会在50至300个时钟周期之间。当转发器是MSIL时,将使用托管的P/Invoke,因为P/Invoke是由一系列声明和非真正代码实现组成的,所以在运行时,由CLR对转换提供支持;相对于本地代码,同样的转发器实现只是稍稍慢一点。

  正如前面所提到的,对于每个函数,IJW都有两个进入点,托管和非托管,但它们的结构决定了,对进入点的调用,在编译时就要确定好(例如指针和vtable)。编译器在编译时,可不知道运行时的调用点托管状态,那它会选择哪一个进入点呢?在Visual Studio .NET 2003中,编译器始终会选择非托管的进入点,这样在调用者是托管代码时,这会产生一个问题,我们称其为“Double P/Invoke”,如插4所示。在这种情况下,非托管转换器对托管调用的转换,结果又被转换回到了托管代码中。


图2:Double P/Invoke问题
  对此,Visual C++ 2005提供了一些解决方案,首先,是关键字__clrcall,它可以指定是否发布非托管进入点,在函数声明时,加上此关键字可防止产生非托管进入点(不利之处在于此函数以后都不能从本地代码中直接调用了);同时,关键字__clrcall也能加在函数指针前。其次,是由Visual C++ 2005提供的Double P/Invoke自动消除,通过运行时检查和cookie,并由运行时决定是否可以跳过非托管转换器,而直接把调用转发到托管进入点中。

  最后一个解决方案就是纯MSIL了,新的编译器选项/clr:pure,可使编译器生成一个不含本地结构的纯托管映像。实际上,它不但可生成遵从CLI标准的程序集,而且通过防止产生非托管转换很好地解决了Double P/Invoke问题。这样,对每一个函数,只有一个进入点——托管进入点,因为没有了非托管进入点,vtable和函数指针也就不存在了。

  虽然代码遵从CLI标准,但不一定意味着它是可验证的,而在例如文件共享等那些低度可信赖环境中,可验证性是非常重要的。为此,微软引入了一个更严格的编译器选项/clr:safe,这对那些需要可验证性代码的C++开发者来说,无疑是雪中送炭。此选项可使编译器生成绝对可验证的程序集,而任何不可验证的程序代码结构,都会导致一个编译时错误。例如,试图编译一个整型指针的变量将会导致错误“int* = this type is not verifiable”,并会指出是在代码中哪一行。而SQL Server 2005存储例程里的所有托管C++代码,都必须用此选项编译。


图3:编译模式
   图3图示了托管和非托管的数据及代码结构,它们由不同的编译器选项生成。如果不包含任何/clr选项,将生成本地映像;使用/clr将生成包含托管和非托管代码及数据的混合映像。而纯MSIL,是通过/clr:pure选项生成的,它不会包含任何非托管代码,虽然在可验证及包含本地数据类型方面并不提供保证。在基于 .NET Framework的平台上,安全MSIL是可验证性代码的理想选择;简单地说,这两个新的编译模式可应用于不同的情况,甚至可以完成在以前看来是不可能或很难完成的任务。

时间: 2024-09-15 03:19:48

体验Visual C++ 2005的现代语言特性(3)的相关文章

体验Visual C++ 2005的现代语言特性(5)

可靠的安全 在2002年,Bill Gates宣布进行的可信赖计算,已对微软公司开发的所有产品带来了深刻的影响.Windows操作系统的开发者花了数月的时间来进行安全方面的训练及代码重审,带来的结果就是,Windows Server 2003成了该公司有史以来发布的最安全的操作系统.Microsoft Office 2003也包含了许多的安全功能,像IRM(Information Rights Management).加强的宏安全.Outlook中阻止下载HTML等等.而Visual C++ 2

体验Visual C++ 2005的现代语言特性(1)

当年Visual Studio.NET 2003 C++编译器的面世,令无数C++语言爱好者都对此垂涎不已:它与ISO C++标准保持98%的一致--这比以前任何一个版本都更加接近,和一体化的语言支持特性,如局部模板特定化:同时也包括了增强的缓冲区安全检查和改进的编译器诊断功能.以往使用C#和Visual Basic.NET的开发者,通过简单的拖放操作,就能生成稳健的Windows窗体应用程序,如今,C++的开发者也加入了进来,而且,这个编译器还对Intel Pentium 4和AMD Athl

体验Visual C++ 2005的现代语言特性(2)

新的Interop 在Visual Studio .NET 2003的所有基于 .NET Framework的语言当中,Visual C++ 2005提供了最好的interop功能.它可不像是纸上谈兵,如今具有了足够的能力来实现真实世界中的场景,一个最好的例子就是把Quake II移植到 .NET Framework平台上,而Visual C++ 2005则更加扩展了这项功能. 在本地和托管世界中,.NET有四种主要的方法可进行interop.对COM的interop可使用RCW(Runtime

体验Visual C++ 2005的现代语言特性(4)

更好的代码优化 一个好的软件开发者总会想方设法提高软件的执行效率,编译器的编写者是一种特殊类型的开发者,不仅代码要执行效率高,而且由它们生成的代码也必须极有效率.因此,任何一个成功的编译器产品,优秀的后台优化是必不可少的.而在这方面,Visual C++ 2005脱颖而出. Visual Studio .NET 2002和Visual Studio .NET 2003在C++编译器中引入了一些非常好的优化方式,也花了很大气力改善本地代码的执行效率,加入了对Intel Pentium 4 CPU的

体验Visual Studio 2005中C++语言

Viusal Studio2005极大地丰富了它的库,可以说是科研背后的清障机和加速器,对于这一点,我想大部分人都是这么认为的.它带来的大量工具及新增的功能性函数使开发人员的生活越来越快乐.简单.但对于我来说,所有这些与Visual Studio2005在C++上做的改变相比却都显得是那么苍白无力.这篇文章中,我着重叙述即将向用户发行的Viusal Studio2005版本给C++带来的变化. 一.对下划线说再见 Visual Studio.NET 2002在C++中引入了可扩展的托管,这种扩展

LINQ体验(2)——C# 3.0新语言特性和改进(上篇)

在第一篇中,知道了Visual Studio 2008新特性,从这篇开始进入此系列的 第二部分--介绍C# 3.0新语言特性和改进. 总体来说, Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心 本身将不再变化(如果不了解.NET2.0的朋友,请参看MSDN或者一些经典的书籍 ),C# 3.0新语言特性在.NET2.0基础上进行了改进,这些改进的功能可以大大 简化我们编写程序.关于C# 3.0新语言特性在博客园里的很多朋友都介绍了,我

LINQ体验(3)——C# 3.0新语言特性和改进(下篇)

上一篇我们介绍了C# 3.0新语言特性和改进上部分,这篇我们继续介绍剩下 的部分. C# 3.0新语言特性和改进包括: 自动属性(Auto- Implemented Properties) 隐含类型局部变量(Local Variable Type Inference) 匿名类型(Anonymous Types) 对象与集合初始化器 (Object and Collection Initializers) 扩展方法(Extension Methods) Lambda表达式和Lambda表达式树 (

体验Visual Studio 2005之类设计器

Visual Studio 类设计器是通用语言运行库的多功能.可视化设计环境.使用 Visual Studio 类设计器可以显现类和其他类型的结构,还可以通过可视化表示方法编辑它们的源代码.对类图的更改将直接反映在代码中,且对代码的更改会直接影响设计器的外观.设计器和代码之间的同步关系,使得可视化创建和配置复杂的 CLR 类型变得容易. 类设计器包含一些专门设计的功能,这些功能将有助于重构代码.方便地重命名标识符以及重载方法.您可以自动生成类和结构,并通过自动生成存根可以实现接口. 最后,类设计

Visual Studio 2005 中的新特性

http://www.c-sharpcorner.com/UploadFile/mahesh/VS2005Editor11162005003633AM/VS2005Editor.aspx?ArticleID=8de67dd3-cc4e-4fb8-a76e-a002d4c0d16e