Tipos Blittable - Blittable types
Tipos blittable são tipos de dados no Microsoft .NET Framework que têm uma apresentação idêntica na memória para ambos geridos código e não gerenciado. Entender a diferença entre os tipos blittable e não blittable pode ajudar no uso de COM Interop ou P / Invoke , duas técnicas para interoperabilidade em aplicativos .NET.
Origem
Uma operação de cópia de memória às vezes é chamada de transferência de bloco , abreviada para bit blit (e o hardware dedicado para fazer essa transferência é chamado de blitter ). Blittable é um termo específico do .NET que expressa se é legal copiar um objeto usando uma transferência em bloco.
Visão geral da interoperabilidade
A interoperabilidade pode ser o compartilhamento bidirecional de dados e métodos entre o código não gerenciado e o código .NET gerenciado . .NET fornece duas maneiras de interoperar entre os dois: COM Interop e P / Invoke. Embora a metodologia seja diferente, em ambos os casos o marshalling (conversão entre representações de dados, formatos para chamar funções e formatos para retornar valores) deve ocorrer. A interoperabilidade COM lida com essa conversão entre o código gerenciado e objetos COM , enquanto P / Invoke lida com as interações entre o código gerenciado e o código Win32 . O conceito de tipos de dados blittable e não blittable se aplica a ambos - especificamente ao problema de conversão de dados entre memória gerenciada e não gerenciada. Esse marshalling é executado pelo interop marshaller, que é chamado automaticamente pelo CLR quando necessário.
Tipos Blittable definidos
Um tipo blittable é um tipo de dados que não requer atenção especial do interop marshaler porque, por padrão, tem uma representação comum em memória gerenciada e não gerenciada. Ao fixar os dados na memória, o coletor de lixo será impedido de movê-los, permitindo que sejam compartilhados no local com o aplicativo não gerenciado. Isso significa que o código gerenciado e não gerenciado irá alterar os locais de memória desses tipos de maneira consistente e muito menos esforço é exigido pelo empacotador para manter a integridade dos dados. A seguir estão alguns exemplos de tipos de blittable disponíveis no .NET Framework:
System.ByteSystem.SByteSystem.Int16System.UInt16System.Int32System.UInt32System.Int64System.UInt64System.IntPtrSystem.UIntPtrSystem.SingleSystem.Double
Além disso, matrizes unidimensionais desses tipos (incluindo buffers fixos inseguros ), bem como tipos complexos contendo apenas campos de instância (que inclui campos somente leitura ) desses tipos são blittable. A presença de campos estáticos ou const que não são blittable não faz com que o tipo se torne não blittable, porque esses campos não desempenham nenhum papel no empacotamento. Tipos complexos (isto é, structs ou classes) também devem ter o layout de campo de instância de Sequential aplicado usando o atributo [StructLayout] para serem considerados blittable pelo empacotador .NET. As estruturas têm este atributo aplicado automaticamente pelo compilador, mas deve ser explicitamente adicionado a uma definição de classe para tornar uma classe de outra forma não blittable blittable.
Se um tipo não for um dos tipos blittable, ele será classificado como não blittable. O motivo pelo qual um tipo é considerado não blittable é que, para uma representação na memória gerenciada, ele pode ter várias representações potenciais na memória não gerenciada ou vice-versa. Como alternativa, pode haver exatamente uma representação para o tipo na memória gerenciada e não gerenciada. Também é comum que simplesmente não haja representação de um lado ou do outro. A seguir estão alguns tipos não blittable comumente usados no .NET Framework:
System.BooleanSystem.CharSystem.ObjectSystem.String
Existem muitos tipos mais blittable e não blittable, e os tipos definidos pelo usuário podem se enquadrar em qualquer uma das categorias, dependendo de como são definidos (MSDN).
Uso
Essa noção muito restritiva de tipos de blittable parece limitar a utilidade dos serviços de interoperabilidade fornecidos pelo .NET, mas não é assim. Enquanto os tipos blittable permitem uma definição direta de tipos interoperáveis, existem várias maneiras de definir explicitamente como um tipo não blittable deve ser convertido pelo empacotador de interoperabilidade. Por exemplo, nas linguagens .NET existem muitos atributos que podem ser aplicados a campos em tipos, aos próprios tipos e aos parâmetros de método para indicar ao empacotador como lidar com esses dados específicos. Esses atributos têm várias finalidades, como detalhar o empacotamento ou alinhamento de um tipo, especificar deslocamentos de campos em um tipo, especificar representações de matriz ou sequência de caracteres, controlar o estilo de passagem de parâmetro para chamadas de função, especificar técnicas de gerenciamento de memória e muito mais. Se nenhum dos atributos ou outras ferramentas fornecidas na estrutura forem adequados, o controle refinado é fornecido pela capacidade de implementar a ICustomMarshaler interface e executar manualmente a conversão de dados em ambas as direções. Compreender o que constitui um tipo blittable permite ao desenvolvedor identificar situações em que a intervenção é ou não necessária para que um tipo seja corretamente empacotado. Dessa forma, menos tempo é desperdiçado em especificações excessivas de tipos ou chamadas de função.
Veja também
- Serviços de invocação de plataforma (P / Invoke)
- .NET Framework
- Lista de idiomas CLI
- COM
- Interoperabilidade
- POD