可直接复制到本机结构中的类型和非直接复制到本机结构中的类型

更新:2010 年 5 月

大多数数据类型在托管和非托管内存中都有公共的表示形式,而不需要 Interop 封送拆收器的特殊处理。 因为这些类型在托管和非托管代码之间传递时不需要转换,因此称为“可直接复制到本机结构中的类型”。

从平台调用返回的结构必须为可直接复制到本机结构中的类型。 平台调用不支持将非直接复制到本机结构中的结构作为返回类型。

下列来自 System 命名空间的类型为可直接复制到本机结构中的类型:

下列复杂类型也是可直接复制到本机结构中的类型:

  • 可直接复制到本机结构中的类型的一维数组,如整数数组。 但是,包含可直接复制到本机结构中的类型的变量数组的类型本身不可直接复制到本机结构中。

  • 只包含可直接复制到本机结构中的类型(如果它们被作为格式化类型封送,则还包含类)的格式化值类型。 有关格式化值类型的更多信息,请参见值类型的默认封送处理

对象引用不可直接复制到本机结构中。 其中包含一组对象引用,它们本身可直接复制到本机结构中。 例如,您可以定义一个可直接复制到本机结构中的结构,但是您不能定义包含对这些结构的一组引用的可直接复制到本机结构中的类型。

作为一种优化方式,在进行封送处理的过程中,可直接复制到本机结构中的类型的数组和只包含可直接复制到本机结构中的成员的类被锁定,而不是被复制。 在调用方和被调用方位于同一单元中时,这些类型可能看上去是被作为 In/Out 参数封送的。 但是,这些类型实际上是作为 In 形参封送的,而如果要将实参作为 In/Out 形参封送,则必须应用 InAttributeOutAttribute 特性。

某些托管数据类型在非托管环境中需要采用一种不同的表示形式。 必须将这些非直接复制到本机结构中的数据类型转换为可进行封送的格式。 例如,托管字符串是非直接复制到本机结构中的类型,这是因为它们必须转换为字符串对象才能进行封送。

下表列出了 System 命名空间中的非直接复制到本机结构中的类型。 委托(它是引用静态方法或类实例的数据结构)也是非直接复制到本机结构中的。

非直接复制到本机结构中的类型

说明

System.Array

转换为 C 样式数组或 SAFEARRAY。

System.Boolean

转换为 1、2 或 4 字节的值,值为 true 时为 1 或 -1。

System.Char

转换为 Unicode 或 ANSI 字符。

System.Class

转换为类接口。

System.Object

转换为变量或接口。

System.Mdarray

转换为 C 样式数组或 SAFEARRAY。

System.String

转换为以 null 引用或 BSTR 引用终止的字符串。

System.Valuetype

转换为具有固定内存布局的结构。

System.Szarray

转换为 C 样式数组或 SAFEARRAY。

类和对象类型只受 COM 互操作支持。 有关 Visual Basic 2005、C# 和 C++ 中的相应类型,请参见 .NET Framework 类库概述

请参见

其他资源

默认封送处理行为

修订记录

日期

修订记录

原因

2010 年 5 月

阐明了对返回类型应用于结构的限制。

内容 Bug 修复