Tipos Blittable e Non-Blittable
A maioria dos tipos de dados tem uma representação comum na memória gerenciada e não gerenciada e não requer tratamento especial pelo marshaller de interoperabilidade. Esses tipos são chamados de tipos blittable porque não exigem conversão quando são passados entre código gerenciado e não gerenciado.
As estruturas retornadas de chamadas de invocação de plataforma devem ser tipos blittable. A invocação de plataforma não suporta estruturas não blittable como tipos de retorno.
Os seguintes tipos do System namespace são tipos blittable:
Os seguintes tipos complexos também são tipos blittable:
Matrizes unidimensionais de tipos primitivos blittable, como uma matriz de inteiros. No entanto, um tipo que contém uma matriz variável de tipos blittable não é em si blittable.
Tipos de valor formatados que contêm apenas tipos blittable (e classes se forem empacotados como tipos formatados). Para obter mais informações sobre tipos de valor formatados, consulte Empacotamento padrão para tipos de valor.
As referências de objeto não são blittable. Isso inclui uma matriz de referências a objetos que são blittable por si mesmos. Por exemplo, você pode definir uma estrutura que seja blittable, mas não pode definir um tipo blittable que contenha uma matriz de referências a essas estruturas.
Como uma otimização, matrizes de tipos primitivos blittable e classes que contêm apenas membros blittable são fixadas em vez de copiadas durante o empacotamento. Esses tipos podem parecer ser organizados como parâmetros de entrada/saída quando o chamador e o destinatário estão no mesmo apartamento. No entanto, esses tipos são realmente empacotados como parâmetros In, e você deve aplicar os InAttribute atributos e OutAttribute se quiser empacotar o argumento como um parâmetro In/out.
Alguns tipos de dados gerenciados exigem uma representação diferente em um ambiente não gerenciado. Esses tipos de dados não blittable devem ser convertidos em um formulário que possa ser empacotado. Por exemplo, cadeias de caracteres gerenciadas são tipos não blittable porque devem ser convertidas em objetos de cadeia de caracteres antes de poderem ser empacotadas.
A tabela a seguir lista os tipos não blittable do System namespace. Os delegados, que são estruturas de dados que se referem a um método estático ou a uma instância de classe, também não são blittable.
Tipo não blittable | Description |
---|---|
System.Array | Converte em uma matriz de estilo C ou em um SAFEARRAY arquivo . |
System.Boolean | Converte para um valor de 1, 2 ou 4 bytes com true como 1 ou -1. |
System.Char | Converte em um caractere Unicode ou ANSI. |
System.Class | Converte em uma interface de classe. |
System.Object | Converte em uma variante ou uma interface. |
System.String | Converte em uma cadeia de caracteres que termina em uma referência nula ou em um BSTR. |
System.ValueType | Converte em uma estrutura com um layout de memória fixa. |
T[] | Converte em uma matriz de estilo C ou em um SAFEARRAY arquivo . |
Os tipos de classe e objeto são suportados apenas pela interoperabilidade COM. Para tipos correspondentes em Visual Basic, C# e C++, consulte a Visão geral da biblioteca de classes.