大多数数据类型在托管和非托管内存中都有一个通用表示形式,无需通过互操作封送器进行特殊处理。 这些类型称为 blittable 类型 ,因为它们在托管代码和非托管代码之间传递时不需要转换。
从平台调用返回的结构必须是 blittable 类型。 平台调用不支持非可直接内存拷贝的结构作为返回类型。
以下 System 命名空间中的类型即是 blittable 类型:
- System.Byte
- System.SByte
- System.Int16
- System.UInt16
- System.Int32
- System.UInt32
- System.Int64
- System.UInt64
- System.IntPtr
- System.UIntPtr
- System.Single
- System.Double
下面的复杂类型也是 blittable 类型:
- blittable 基元类型的一维数组,如整数数组。 但是,包含 blittable 类型变量数组的类型本身不是 blittable 类型。
- 仅包含可直接封送类型的格式化值类型(以及作为格式化类型封送的类)。 有关格式化的值类型的详细信息,请参阅值类型的默认封送处理。
对象引用不是可被直接内存复制的。 此外,指向自身已是 blittable 的对象的引用数组也不是 blittable。 例如,可以定义一个 blittable 结构,但不能定义包含对这些结构的引用数组的 blittable 类型。
作为一种优化方式,blittable 基元类型数组和仅包含 blittable 成员的类在封送处理期间会进行锁定,而不会进行复制。 若调用方和被调用方位于同一单元中,这些类型似乎可作为 In/Out 参数封送。 但是,这些类型实际上是作为 In 形参进行封送的,而且,如果要将实参作为 In/Out 形参进行封送,则必须应用 InAttribute 和 OutAttribute 属性。
在非托管环境中,某些托管数据类型要求具有不同的表示形式。 这些不可直接传递的数据类型必须转换为可封送的格式。 例如,托管字符串是不可指定的类型,因为它们必须转换为字符串对象,然后才能封送这些对象。
下表列出了来自于 System 命名空间的不可平移类型。 委托(是指引用静态方法或类实例的数据结构)也是不可读取的。
| 非易控类型 | 描述 |
|---|---|
| System.Array | 转换为 C 样式数组或 SAFEARRAY。 |
| System.Boolean | 转换为 1、2 或 4 字节的值,true 表示 1 或 -1。 |
| System.Char | 转换为 Unicode 或 ANSI 字符。 |
| System.Class | 转换为类接口。 |
| System.Object | 转换为变量或接口。 |
| System.String | 转换为空引用中的终止字符串或转换为 BSTR。 |
| System.ValueType | 转换为具有固定内存布局的结构。 |
| T[] | 转换为 C 样式数组或 SAFEARRAY。 |
类和对象类型仅受 COM 互操作支持。