Blittable and Non-Blittable Types
Most data types have a common representation in both managed and unmanaged memory and do not require special handling by the interop marshaller. These types are called blittable types because they do not require conversion when they are passed between managed and unmanaged code.
Structures that are returned from platform invoke calls must be blittable types. Platform invoke does not support non-blittable structures as return types.
The following types from the System namespace are blittable types:
The following complex types are also blittable types:
One-dimensional arrays of blittable primitive types, such as an array of integers. However, a type that contains a variable array of blittable types is not itself blittable.
Formatted value types that contain only blittable types (and classes if they are marshalled as formatted types). For more information about formatted value types, see Default marshalling for value types.
Object references are not blittable. This includes an array of references to objects that are blittable by themselves. For example, you can define a structure that is blittable, but you cannot define a blittable type that contains an array of references to those structures.
As an optimization, arrays of blittable primitive types and classes that contain only blittable members are pinned instead of copied during marshalling. These types can appear to be marshalled as In/Out parameters when the caller and callee are in the same apartment. However, these types are actually marshalled as In parameters, and you must apply the InAttribute and OutAttribute attributes if you want to marshal the argument as an In/Out parameter.
Some managed data types require a different representation in an unmanaged environment. These non-blittable data types must be converted into a form that can be marshalled. For example, managed strings are non-blittable types because they must be converted into string objects before they can be marshalled.
|System.Array||Converts to a C-style array or a
|System.Boolean||Converts to a 1, 2, or 4-byte value with
|System.Char||Converts to a Unicode or ANSI character.|
|System.Class||Converts to a class interface.|
|System.Object||Converts to a variant or an interface.|
|System.Mdarray||Converts to a C-style array or a
|System.String||Converts to a string terminating in a null reference or to a BSTR.|
|System.Valuetype||Converts to a structure with a fixed memory layout.|
|System.Szarray||Converts to a C-style array or a
Class and object types are supported only by COM interop. For corresponding types in Visual Basic, C#, and C++, see the Class Library Overview.