CLR+互操作完全介绍

CLR+互操作完全介绍

ID:37856262

大小:242.50 KB

页数:10页

时间:2019-06-01

CLR+互操作完全介绍_第1页
CLR+互操作完全介绍_第2页
CLR+互操作完全介绍_第3页
CLR+互操作完全介绍_第4页
CLR+互操作完全介绍_第5页
资源描述:

《CLR+互操作完全介绍》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、CLR完全介绍托管代码与非托管代码之间的封送处理YiZhang and XiaoyingGuo 目录[InAttribute]和[OutAttribute]关键字Out和Ref以及通过引用传递返回值StringBuilder和封送处理复制和固定内存所有权反向P/Invoke和委托生存期P/InvokeInteropAssistant尝试一下让我们面对现实吧。这个世界并不完美。几乎很少有公司在完全用托管代码开发程序,除此之外仍存在很多需要您处理的旧式非托管代码。您怎样将托管和非托管项目集成起来呢?在形式上是采用从托管应用程序调用非托管代码,还是从非托管代码应用程序调用托管代码?幸运的是,

2、Microsoft®.NETFramework互操作在托管和非托管代码之间开辟了一条通道,而封送处理则在该连接中扮演着非常重要的角色,因为它允许在两者之间进行数据交换(请参见图1)。有很多因素会影响CLR在非托管和托管领域之间封送数据的方式,包括诸如[MarshalAs]、[StructLayout]、[InAttribute]和[OutAttribute]等属性,以及C#中out和ref之类的语言关键字。Figure1 BridgingtheGapbetweenManagedandUnmanagedCode (单击该图像获得较大视图)因为这些因素很多,所以它可能是进行正确封送的一大难

3、题,因为这项工作要求了解很多有关非托管和托管代码的详细情况。在本专栏中,我们会介绍您在日常工作中尝试进行封送处理时将遇到的一些基本却又容易混淆的主题。我们不会介绍自定义封送处理、封送处理复杂的结构或其他高级主题,但是如果真正理解了这些基本的概念,您就为处理这些问题做好准备了。[InAttribute]和[OutAttribute]我们要讨论的第一个封送处理主题是关于InAttribute和OutAttribute的使用,这是位于System.Runtime.InteropServices命名空间中的两种属性类型。(在将这些属性应用到您的代码中时,C#和VisualBasic®允许使用缩

4、写形式[In]和[Out],但是为了避免混淆我们坚持使用全名。)当应用于方法参数和返回值时,这些属性会控制封送处理的方向,因此它们又被称为方向属性。[InAttribute]告知CLR在调用开始的时候将数据从调用方封送到被调用方,[OutAttribute]则告知CLR在返回的时候将数据从被调用方封送回调用方。调用方和被调用方都可以是非托管或托管代码。例如,在P/Invoke调用中,是托管代码在调用非托管代码。但是在反向P/Invoke调用中,就可能是非托管代码通过函数指针调用托管代码。[InAttribute]和[OutAttribute]有四种可能的使用组合:只用[InAttrib

5、ute]、只用[OutAttribute]、同时使用[InAttribute,OutAttribute]以及两者都不用。如果没有指定任何一个属性,那就是要CLR自己确定方向属性,默认情况下通常是使用[InAttribute]。但是,如果是StringBuilder类,则在没有指定任何一个属性的情况下,会同时使用[InAttribute]和[OutAttribute]。(有关详细信息,请参阅后面有关StringBuilder的部分。)另外,使用C#中的out和ref关键字可能会更改已应用的属性,如图2所示。请注意,如果没有为参数指定关键字,就意味着它是默认的输入参数。 Figure 2 

6、OutandRefandTheirAssociatedAttributesC#关键字属性(未指定)[InAttribute]out[OutAttribute]ref[InAttribute],[OutAttribute]请看一下图3中的代码。其中有三个本机C++函数,并且它们都对arg进行相同的更改。此外,请注意对字符串操作使用strcpy仅仅是为了便于说明——生产代码应改用这些函数的安全版本,它们可在msdn.microsoft.com/msdnmag/issues/05/05/SafeCandC中找到。 Figure 3 TryingOutDirectionalAttributes

7、复制代码MARSHALLIB_APIvoid__stdcallFunc_In_Attribute(char*arg){printf("InsideFunc_In_Attribute:arg=%s",arg);strcpy(arg,"New");}MARSHALLIB_APIvoid__stdcallFunc_Out_Attribute(char*arg){printf("InsideFunc_Out_Attribute:arg=%s",

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。