- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CLR互操作完全介绍
CLR 完全介绍
托管代码与非托管代码之间的封送处理
Yi Zhang?and?Xiaoying Guo
?目录
[InAttribute] 和 [OutAttribute] 关键字 Out 和 Ref 以及通过引用传递 返回值 StringBuilder 和封送处理 复制和固定 内存所有权 反向 P/Invoke 和委托生存期 P/Invoke Interop Assistant 尝试一下
让我们面对现实吧。这个世界并不完美。几乎很少有公司在完全用托管代码开发程序,除此之外仍存在很多需要您处理的旧式非托管代码。您怎样将托管和非托管项目集成起来呢?在形式上是采用从托管应用程序调用非托管代码,还是从非托管代码应用程序调用托管代码?
幸运的是,Microsoft? .NET Framework 互操作在托管和非托管代码之间开辟了一条通道,而封送处理则在该连接中扮演着非常重要的角色,因为它允许在两者之间进行数据交换(请参见图 1)。有很多因素会影响 CLR 在非托管和托管领域之间封送数据的方式,包括诸如 [MarshalAs]、[StructLayout]、[InAttribute] 和 [OutAttribute] 等属性,以及 C# 中 out 和 ref 之类的语言关键字。
Figure 1?Bridging the Gap between Managed and Unmanaged Code?(单击该图像获得较大视图)
因为这些因素很多,所以它可能是进行正确封送的一大难题,因为这项工作要求了解很多有关非托管和托管代码的详细情况。在本专栏中,我们会介绍您在日常工作中尝试进行封送处理时将遇到的一些基本却又容易混淆的主题。我们不会介绍自定义封送处理、封送处理复杂的结构或其他高级主题,但是如果真正理解了这些基本的概念,您就为处理这些问题做好准备了。
[InAttribute] 和 [OutAttribute]
我们要讨论的第一个封送处理主题是关于 InAttribute 和 OutAttribute 的使用,这是位于 System.Runtime.InteropServices 命名空间中的两种属性类型。(在将这些属性应用到您的代码中时,C# 和 Visual Basic? 允许使用缩写形式 [In] 和 [Out],但是为了避免混淆我们坚持使用全名。)
当应用于方法参数和返回值时,这些属性会控制封送处理的方向,因此它们又被称为方向属性。[InAttribute] 告知 CLR 在调用开始的时候将数据从调用方封送到被调用方,[OutAttribute] 则告知 CLR 在返回的时候将数据从被调用方封送回调用方。调用方和被调用方都可以是非托管或托管代码。例如,在 P/Invoke 调用中,是托管代码在调用非托管代码。但是在反向 P/Invoke 调用中,就可能是非托管代码通过函数指针调用托管代码。
[InAttribute] 和 [OutAttribute] 有四种可能的使用组合:只用 [InAttribute]、只用 [OutAttribute]、同时使用 [InAttribute, OutAttribute] 以及两者都不用。如果没有指定任何一个属性,那就是要 CLR 自己确定方向属性,默认情况下通常是使用 [InAttribute]。但是,如果是 StringBuilder 类,则在没有指定任何一个属性的情况下,会同时使用 [InAttribute] 和 [OutAttribute]。(有关详细信息,请参阅后面有关 StringBuilder 的部分。)另外,使用 C# 中的 out 和 ref 关键字可能会更改已应用的属性,如图 2 所示。请注意,如果没有为参数指定关键字,就意味着它是默认的输入参数。
?Figure?2?Out and Ref and Their Associated Attributes
C# 关键字 属性 (未指定) [InAttribute] out [OutAttribute] ref [InAttribute],[OutAttribute] 请看一下图 3 中的代码。其中有三个本机 C++ 函数,并且它们都对 arg 进行相同的更改。此外,请注意对字符串操作使用 strcpy 仅仅是为了便于说明——生产代码应改用这些函数的安全版本,它们可在 /msdnmag/issues/05/05/SafeCandC 中找到。
?Figure?3?Trying Out Directional Attributes
复制代码
MARSHALLIB_API void __stdcall Func_In_Attribute(char *arg)
{
printf(Inside F
您可能关注的文档
最近下载
- 露天矿采矿与剥离作业规程.pdf VIP
- 电大国家开放大学《政府经济学》(本)2025-2026期末试题及答案2025.pdf VIP
- 第27课 定速巡航的控制 教案 义务教育人教版信息科技六年级全一册.docx VIP
- 幼儿园美术教案《沙漠里的树》植树节主题活动PPT课件.doc VIP
- Java基础知识大全单选题100道及答案.docx VIP
- 工匠精神精品课件.pptx
- 25《带上她的眼睛》课件(共45张PPT).pptx
- 上海海事大学2021-2022年《货币银行学》期末考试试卷(A卷)含参考答案.docx
- 2024年福建省中考化学真题试卷(含答案).docx VIP
- 风电场并网测试方案.docx
文档评论(0)