网站大量收购独家精品文档,联系QQ:2885784924

Net封送处理.pptVIP

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Net封送处理

Interop 封送处理概述 大多数数据类型在托管和非托管内存中都具有公共的表示形式。Interop 封送拆收器为您处理这些类型。其他类型可能是不明确的,或根本不在托管内存中表示。 不明确的类型可能或者具有多种映射到单个托管类型的非托管表示形式,或者,或者缺少类型信息(如数组的大小)。对于不明确的类型,封送拆收器提供默认表示形式和替换表示形式(当存在多种表示形式时)。可以向封送拆收器提供有关它如何封送不明确类型的显式指令。 除涉及回调函数时以外,平台调用方法调用从托管代码流向非托管代码,而绝不会以相反方向流动。虽然平台调用的调用只能从托管代码流向非托管代码,但是数据仍然可以作为 In 或 Out 参数在两个方向流动。 Interop 封送拆收器在公共语言运行库堆和非托管堆之间封送数据。每当调用方和被调用方无法操作数据的同一个实例时就发生封送处理。Interop 封送拆收器使调用方和被调用方都能够看上去像是在操作同一数据,即使调用方和被调用方都有它们自己的数据副本。 默认封送处理行为 互操作封送处理遵循一些规则进行操作,这些规则指定与方法参数相关联的数据在托管和非托管内存之间传递时的行为方式。这些内置规则控制以下行为,包括数据类型转换这样的封送处理活动,被调用方是否可以更改传递给它的数据并将这些更改返回给调用方,以及在何种情况下封送拆收器提供性能优化。 Interop 封送拆收器进行内存管理 Interop 封送拆收器始终尝试释放非托管代码所分配的内存。此行为符合 COM 内存管理规则,但与控制本机 C++ 的规则不一致。 如果在使用平台调用(自动为指针释放内存)时预期采用本机 C++ 行为(不释放内存),则可能造成混乱。例如,从 C++ DLL 调用以下非托管方法不自动释放任何内存。 参数方向属性 每个方法参数都可以与 InAttribute 属性和/或 OutAttribute 属性的设置关联。可以在设计时应用方向属性以修改托管和非托管内存之间的运行时封送处理。 方向属性是可选的。可以在希望改变封送拆收器的默认行为时将它们应用于方法参数。如果忽略来自方法参数的方向属性,则封送拆收器将根据参数的类型(值或引用)及其修饰符(如果有的话)确定方向流。 ref 和 out 参数修饰符导致方法参数通过引用而不是通过值进行封送。通过值传递的方法参数被作为堆栈上的值封送到非托管代码;通过引用传递的参数被作为堆栈上的指针封送。 Interop 封送拆收器保证下列与方向属性有关的行为: Interop 封送拆收器从不生成对从非托管代码传递的 In 参数的写操作。因此,非托管代码可以安全地传递指向只读页的指针,或传递指向被同时访问的数据的指针。 当复制的对象包含已分配的对象(如 BSTR)时,封送拆收器总是执行 In/Out 设置所要求的正确的分配和销毁顺序。 可直接复制到本机结构中的类型 System.Byte System.SByte System.Int16 System.UInt16 System.Int32 System.UInt32 System.Int64 System.UInt64 System.IntPtr System.UIntPtr System.Single System.Double 可直接复制到本机结构中的类型的一维数组,如整数数组。但是,包含可直接复制到本机结构中的类型的变量数组的类型本身不可直接复制到本机结构中。 只包含可直接复制到本机结构中的类型(如果它们被作为格式化类型封送,则还包含类)的格式化值类型 非直接复制到本机结构中的类型 必须将这些非直接复制到本机结构中的数据类型转换为可进行封送的格式 复制和锁定 封送数据时,Interop 封送拆收器可以复制或锁定正在封送的数据。复制数据时将一个内存位置中的数据的副本放置到另一个内存位置中。 复制和锁定 锁定操作将数据暂时锁定在其当前内存位置中,从而阻止公共语言运行库的垃圾回收器将其重定位。封送拆收器锁定数据以减小复制的系统开销并提高性能。数据的类型确定在封送处理过程中它是被复制还是被锁定。 锁定操作在封送诸如 String 之类的对象的过程中自动执行。然而,您也可以使用 GCHandle 类手动锁定内存。 复制和锁定 可直接复制到本机结构中的格式化类 可直接复制到本机结构中的格式化类具有固定布局(格式化)以及在托管和非托管内存中的公共数据表示形式。当这些类型需要封送处理时,指向堆中的对象的指针被直接传递给被调用方。被调用方可以更改该指针所引用的内存位置的内容。 非直接复制到本机结构中的格式化类 如果按值封送非直接复制到本机结构中的类,则被调用方接收指向该数据结构的副本的指针。 如果按引用封

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档