- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Interop 封送处理概述
Interop 封送处理概述
大多数数据类型在托管和非托管内存中都具有公共的表示形式。Interop 封送拆收器为您处理这些类型。其他类型可能是不明确的,或根本不在托管内存中表示。
不明确的类型可能或者具有多种映射到单个托管类型的非托管表示形式,或者,或者缺少类型信息(如数组的大小)。对于不明确的类型,封送拆收器提供默认表示形式和替换表示形式(当存在多种表示形式时)。可以向封送拆收器提供有关它如何封送不明确类型的显式指令。
除涉及回调函数时以外,平台调用方法调用从托管代码流向非托管代码,而绝不会以相反方向流动。虽然平台调用的调用只能从托管代码流向非托管代码,但是数据仍然可以作为 In 或 Out 参数在两个方向流动。
Interop 封送拆收器在公共语言运行库堆和非托管堆之间封送数据。每当调用方和被调用方无法操作数据的同一个实例时就发生封送处理。Interop 封送拆收器使调用方和被调用方都能够看上去像是在操作同一数据,即使调用方和被调用方都有它们自己的数据副本。
默认封送处理行为
互操作封送处理遵循一些规则进行操作,这些规则指定及方法参数相关联的数据在托管和非托管内存之间传递时的行为方式。这些内置规则控制以下行为,包括数据类型转换这样的封送处理活动,被调用方是否可以更改传递给它的数据并将这些更改返回给调用方,以及在何种情况下封送拆收器提供性能优化。
Interop 封送拆收器进行内存管理
Interop 封送拆收器始终尝试释放非托管代码所分配的内存。此行为符合 COM 内存管理规则,但及控制本机 C++ 的规则不一致。
如果在使用平台调用(自动为指针释放内存)时预期采用本机 C++ 行为(不释放内存),则可能造成混乱。例如,从 C++ DLL 调用以下非托管方法不自动释放任何内存。
BSTR MethodOne (BSTR b) {
return b;
}
但是,如果将该方法定义为平台调用原型,用 String 类型替换每个 BSTR 类型,并调用 MethodOne,则公共语言运行库将尝试释放 b 两次。可以通过使用 IntPtr 类型(而不是 String 类型)更改封送处理行为。
运行库始终使用 CoTaskMemFree 方法来释放内存。如果使用的内存不是用 CoTaskMemAlloc 方法分配的,则必须使用 IntPtr 并使用适当的方法手动释放内存。同样,可以在永远不应释放内存的情况下避免自动内存释放,例如,在从 Kernel32.dll(返回指向内核内存的指针)使用 GetCommandLine 函数时。
参数方向属性
每个方法参数都可以及 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
可直接复制到本机结构中的类型的一维数组,如整数数组。但是,包含可直接复制到本机结构中的类型的变量数组的类型本身不可直接复制到本机结构中。
只包含可直接复制到本机结构中的类型(如果它们被作为格式化类型封送,则还包含类)的格式化值类型
对象引用不可直接复制到本机结构中。其中包含一组对象引用,它们本身可直接复制到本机结构中。例如,您可以定义一个可直接复制到本机结构中的结构,但是您不能定义包含对这些结构的一组引用的可直接复制到本机结构中的类型。
作为一种优化方式,在进行封送处理的过程中,可直接复制到本机结构中的类型的数组和只包含可直接复制到本机结
文档评论(0)