您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:87 来源:vckbase.com

本文章共13664字,分9页,当前第5页,快速翻页:
 

   此外,Visual Studio .NET 2003 很少生成可供验证的代码。而就算它能的话,它所花费在处理一些其它重要问题上的时间也会比较多。而 MSIL 对非验证代码由着一流的支持(你可以进行指针算术运算,间接载入和访问本机堆),经验证的代码使你能够处理一些需要部分信任的情况,其中你可以轮流使用 Visual Studio 2005 提供的丰富特色。由于在 SQL Server 2005 中的托管代码主机依赖于部分信任,所以一次点击部署(ClickOnce)也是一样。Visual C 2005 开发小组的一个首要目标就是让编译器能够在开发人员开发非混合和经验证的镜像产品时有所帮助。他们通过引入两个新编译器开关来实现这一点:/clr:pure 和 /clr:safe,在我向你解释如何使用这些新开关 之前,我需要介绍一下 C 的 Interop 是如何工作的。

逆@风@者
“运行正常”

  在Visual Studio .NET 2003 中,C Interop 技术又被称为 IJW 或是“运行正常”。在即将推出的版本中,这被改为一个更具描述性的名字“Interop 技术”。那么它是如何“正常运行”的呢?对于每个由应用程序使用的本机方法而言,编译器同时创建了一个托管的入口和一个非托管的入口。 它们中的一个有着实际上的代码实现,而另外一个是一个转发代码块,它创建适当的转化并进行任何必要的封送处理。托管入口经常被用来做实际上的代码实现,除非当这个方法的代码无法用 MSIL 表示时或者开发人员使用“#pragma unmanaged”编译器参数来迫使本机入口为实际的代码实现。
   当使用一个 IJW 转发模块时(举个例子,当本机入口是转发模块时)编译器提供给模块以代码实现并通过一个偏移量或是一个引入地址表(IAT)得跳转来调入实际的代码实现。对 IJW 模块时间复杂度的估计大约介于50到300个时钟周期之间(尽管精心挑选的测试情况可以使这个数字减至只有10那末大)。当转发模块是 MSIL 时,托管的 P/Invoke 就会派上用场。P/Invoke 仅包含一个声明而没有实际的方法实现;CLR 提供了对模块的运行时支持的功能。这些转发模块通常都会比相同功用的本机实现稍微慢一点点。
   如上所述,使用 IJW 的结果使每个函数都有两个入口,一个托管的和一个非托管的。但某些结构需要在编译时对这些入口进行填充(举个例子,像函数指针和虚表 vtable)。而如果在编译时,我们无法获知在运行时调用地址的托管状态,那么编译器应该如何确定选哪一个入口呢?在 Visual Studio .NET2003 中,编译器总是会选择非托管入口。当然,这会在调用函数确实是托管的时候造成麻烦,这个问题就是 Double P/Invoke 问题。( 参见 Figure 4)在这种情形下,托管转换对非托管模块的调用只会导致对托管代码的调用,这样的操作会导致几个大的不必要的开销。

Figure 4 Double P/Invoke问题

  Visual C 2005 提出了几个解决方案。第一个方案就是使用可以让你去声明一个关键字:__clrcall,它确定是否在以方法轮换基础上安置一个非托管入口。使用这个关键字来对函数声明,可以防止产生一个非托管入口(这样做的一个缺点就是这个函数就不能被本机代码直接调用了)。__clrcall 关键字也可以被放置在一个函数指针上,这样在编译器有所选择的情况下,会使这个指针挂载一个托管入口。Visual C 2005 提供的第二方案来解决 Double P /Invoke 问题使它使用了运行时校验和一个 cookie 来帮助运行库去决定是否非托管模块可以被忽略,从而来将调用直接转发至托管入口。然而这一特性并不一定会完全解决问题。
  第三个方案是纯 MSIL。新的 /clr:pure 编译器标签告诉便一起去产生一个毫无本机结构的纯托管镜像。这样不仅产生了可应用于部分信任情况的,与 CLI 相兼容的程序块,还通过防止生成非托管模块解决了 Double P/Invoke 问题。结果是,每一个函数只有一个入口(托管入口),这样虚表vtable 和函数指针就不会被非托管入口挂载。
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 下一页>>
相关文章

IP Messenger 详细分析
可设置单元格颜色的ClistCtrl类
利用VC++开发ASP图像处理组件(二)
从 ADO 迁移到 ADO.NET(一)
获得 Win32 窗口句柄的更好的方法
关于 IDispatch 接口的 LPDispatch 属性的实
用ATL开发复合控件
后缀表达式求值及校验
浅谈PDFlib中文输出(四)PDFlib 接收的几种
事件编程(二)
毫秒定时器
类似于FlashGet的悬浮框的制作
不重起Windows直接更改IP地址
MFC程序员的WTL指南: 中文版序言
COM 组件设计与应用(五)——用 ATL 写第一
编写多文档应用程序
PhotoShop插件开发之选区(Selection)
VC初学者入门系列之二:消息循环
定制调试诊断工具和实用程序——摆脱DLL“地
WMI 的一个实现

相关评论


本文章所属分类:首页 VC++

  热门关键字: