Tipos que pueden o que no pueden transferirse en bloque de bitsBlittable and Non-Blittable Types

La mayoría de los tipos de datos tienen una representación común en la memoria administrada y no administrada, y no requieren un tratamiento especial por parte del serializador de interoperabilidad.Most data types have a common representation in both managed and unmanaged memory and do not require special handling by the interop marshaler. Estos tipos se denominan tipos que pueden transferirse en bloque de bits porque no requieren conversión cuando se pasan entre código administrado y código no administrado.These types are called blittable types because they do not require conversion when they are passed between managed and unmanaged code.

Las estructuras que se devuelven de llamadas de invocación de plataforma deben ser tipos que pueden transferirse en bloque de bits.Structures that are returned from platform invoke calls must be blittable types. La invocación de plataforma no admite estructuras que no pueden transferirse en bloque de bits como tipos de valor devuelto.Platform invoke does not support non-blittable structures as return types.

Los siguientes tipos del espacio de nombres System son tipos que pueden transferirse en bloque de bits:The following types from the System namespace are blittable types:

Los siguientes tipos complejos también son tipos que pueden transferirse en bloque de bits:The following complex types are also blittable types:

  • Las matrices unidimensionales de tipos que pueden transferirse en bloque de bits, como una matriz de enteros.One-dimensional arrays of blittable types, such as an array of integers. Pero un tipo que contiene una matriz variable de tipos que pueden transferirse en bloque de bits no se puede transferir en bloque de bits.However, a type that contains a variable array of blittable types is not itself blittable.

  • Los tipos de valor con formato que solo contienen tipos que pueden transferirse en bloque de bits (y clases si se serializan como tipos con formato).Formatted value types that contain only blittable types (and classes if they are marshaled as formatted types). Para obtener más información sobre los tipos de valor con formato, vea Serialización predeterminada para tipos de valor.For more information about formatted value types, see Default marshaling for value types.

Las referencias a objetos no pueden transferirse en bloque de bits.Object references are not blittable. Esto incluye una matriz de referencias a objetos que pueden transferirse en bloque de bits por sí mismos.This includes an array of references to objects that are blittable by themselves. Por ejemplo, se puede definir una estructura que puede transferirse en bloque de bits, pero no se puede definir un tipo que puede transferirse en bloque de bits que contiene una matriz de referencias a esas estructuras.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.

Como optimización, las matrices de tipos que pueden transferirse en bloque de bits y las clases que solo contienen miembros que pueden transferirse en bloque de bits se anclan en lugar de copiarse durante la serialización.As an optimization, arrays of blittable types and classes that contain only blittable members are pinned instead of copied during marshaling. Estos tipos pueden parecer serializados como parámetros In/Out cuando el autor y el destinatario de la llamada están en el mismo contenedor.These types can appear to be marshaled as In/Out parameters when the caller and callee are in the same apartment. Pero estos tipos se serializan realmente como parámetros In y se deben aplicar los atributos InAttribute y OutAttribute si se quiere serializar el argumento como un parámetro In/Out.However, these types are actually marshaled as In parameters, and you must apply the InAttribute and OutAttribute attributes if you want to marshal the argument as an In/Out parameter.

Algunos tipos de datos administrados requieren una representación diferente en un entorno sin administrar.Some managed data types require a different representation in an unmanaged environment. Estos tipos de datos que no pueden transferirse en bloque de bits se deben convertir a un formato que se pueda serializar.These non-blittable data types must be converted into a form that can be marshaled. Por ejemplo, las cadenas administradas son tipos que no pueden transferirse en bloque de bits porque se deben convertir en objetos de cadena antes de que se puedan serializar.For example, managed strings are non-blittable types because they must be converted into string objects before they can be marshaled.

En la tabla siguiente se enumeran los tipos del espacio de nombres System que no pueden transferirse en bloque de bits.The following table lists non-blittable types from the System namespace. Delegados, que son estructuras de datos que hacen referencia a un método estático o a una instancia de clase, y que tampoco pueden transferirse en bloque de bits.Delegates, which are data structures that refer to a static method or to a class instance, are also non-blittable.

Tipo que no puede transferirse en bloque de bitsNon-blittable type DescripciónDescription
System.ArraySystem.Array Se convierte a una matriz de estilo de C o a una SAFEARRAY.Converts to a C-style array or a SAFEARRAY.
System.BooleanSystem.Boolean Se convierte a un valor de uno, dos o cuatro bytes con true como 1 o -1.Converts to a 1, 2, or 4-byte value with true as 1 or -1.
System.CharSystem.Char Se convierte a un carácter ANSI o Unicode.Converts to a Unicode or ANSI character.
System.ClassSystem.Class Se convierte a una interfaz de clase.Converts to a class interface.
System.ObjectSystem.Object Se convierte a una variante o una interfaz.Converts to a variant or an interface.
System.MdarraySystem.Mdarray Se convierte a una matriz de estilo de C o a una SAFEARRAY.Converts to a C-style array or a SAFEARRAY.
System.StringSystem.String Se convierte a una cadena que termina en una referencia nula o a un tipo BSTR.Converts to a string terminating in a null reference or to a BSTR.
System.ValuetypeSystem.Valuetype Se convierte a una estructura con un diseño de memoria fijo.Converts to a structure with a fixed memory layout.
System.SzarraySystem.Szarray Se convierte a una matriz de estilo de C o a una SAFEARRAY.Converts to a C-style array or a SAFEARRAY.

Solo se admiten los tipos de clase y objeto con la interoperabilidad COM.Class and object types are supported only by COM interop. Para obtener los tipos correspondientes en Visual Basic, C# y C++, vea el artículo de introducción a la biblioteca de clases.For corresponding types in Visual Basic, C#, and C++, see the Class Library Overview.

Vea tambiénSee also