Visão geral do empacotamento (marshaling)
The .NET Compact Framework versão 2,0 Fornece suporte de marshaling expandido por meio de IDispatch e por meio de invocação de plataforma e chamadas vtable. Esse suporte inclui o seguinte:
Usando o MarshalAsAttribute atributo.
marshaling de tipos variantes que são suportados em Windows Embedded CE.
Empacotamento de tipos que chamam interfaces COM através de uma vtable.
Empacotamento de estruturas com matrizes e sequências embarcadas.
Especificar o layout de uma estrutura.
Você pode empacotar os seguintes tipos por valor ou por referência:
BStr
IUnknown
IDispatch
SafeArray
DateTime (empacotado sistema autônomo uma OLE DATE)
Variant
Observe que o .NET Compact Framework 2,0 oferece suporte a AllocHGlobal e FreeHGlobal métodos.
Log de Interoperabilidade
Você pode criar arquivos de log das assinaturas das funções para ver como uma chamada Interop é empacotada.Para obter mais informações sobre como criar os arquivos, consulte Como: Criar arquivos de log. Para obter informações sobre como interpretar os arquivos de log, consulte Informações de arquivo de log.
marshaling de diferenças com o .NET estrutura completo
The .NET Compact Framework não suporta os seguintes recursos de marshaling e interoperabilidade fornecidos no completo .NET Framework:
marshaling personalizado.
Obter um delegado gerenciado de um ponteiro de função nativa usando o GetDelegateForFunctionPointer método. Entretanto, você pode criar um ponteiro de função nativo a partir de um delegado gerenciado.
Acessando .NET Compact Framework classes de componentes nativo.
Passar estruturas (VT_RECORD) através de IDispatch.
Passar tipos Int64 e UInt64 através de IDispatch.
The .NET Compact Framework difere completo .NET Framework em comportamentos de marshaling a seguir:
The .NET Compact Framework permite que matrizes de valores SCODE ser empacotado completo .NET Framework não ocorre.
The .NET Compact Framework empacota matrizes de ponteiros IUnknown e IDispatch diferente completo .NET Framework.
The .NET Compact Framework inicializa todos sistema autônomo threads sistema autônomo multithread apartments e não oferece suporte a outros modelos de threading ou definir um modelo de apartment. Conseqüentemente, a .NET Compact Framework não oferece suporte a ApartmentState propriedades ou métodos a seguir:
Empacotamento com a instrução Declare no Visual Basic
O Visual Basic Declare demonstrativo é uma alternativa para declare referências a procedimentos externos em uma DLL. Observe que Ansi Não há suporte para a palavra-chave na demonstrativo Declare.
marshaling com o Declare demonstrativo é idêntica de marshaling com o DllImportAttribute classe, exceto para ByVal String objetos. In a Declare statement, a ByVal String parameter will be marshaled as an output parameter.Como seqüências de caracteres são imutáveis, isso força o Common linguagem tempo de execução para copiar a seqüência de caracteres e retornar uma nova referência.
Diferenças entre IDispatch e empacotadores de invocação de plataforma
A tabela a seguir lista os tipos que são empacotados de forma diferente pelos dois empacotadores.
Type (Tipo) |
IDispatch |
Invocação de plataforma e vtable |
---|---|---|
BStr |
wchar * |
|
Variant |
NULL |
|
VARIANT_BOOL |
Byte |
|
SafeArray |
Matriz estilo C |
The .NET Compact Framework empacota uma classe por meio de invocação de plataforma sem a StructLayoutAttribute sistema autônomo um layout automático estrutura; completo .NET Framework empacota-lo sistema autônomo um COM callable wrapper (CCW).
Observe que o .NET Compact Framework marcas de um SafeArray com FADF_FIXEDSIZE e lança uma exceção se você redimensioná-lo em código nativo.
Em situações em que Boolean Converte um tipo de byte nativa, você não pode realizar realizar marshaling Boolean sistema autônomo um tipo de retorno; você pode empacotá-lo apenas sistema autônomo um argumento.
Empacotamento de Delegados
Por padrão, delegados são empacotados como ponteiros de função.Você também pode usar explicitamente a FunctionPtr o valor das UnmanagedType enumeração para criar uma instância das MarshalAsAttribute. Consulte Empacotamento de Delegados como Ponteiros de função para obter exemplos.
Especificando um conjunto de caracteres
Você pode usar o CharSet campo de DllImportAttribute Para especificar um conjunto de caracteres invocar quando se faz o marshaling de strings através de plataforma.
The .NET Compact Framework suporta os dois valores a seguir:
Auto.Seqüências de caractere são empacotadas usando o apropriado conjunto de caractere para o sistema operacional, que é o Unicode conjunto de caractere.Este é o valor padrão.
Unicode.Seqüências de caractere são empacotadas usando o conjunto de caractere Unicode.
The Ansi valor não é suportado pois Windows Embedded CE só é Unicode. None é equivalente a Ansi e não é suportado.
Porque o .NET Compact Framework não oferece suporte a ExactSpelling campo, o Common linguagem tempo de execução automaticamente procura uma entrada aponte segundo para os valores especificados pelo CharSet.
Marcação de Objeto
Quando o .NET Compact Framework Common linguagem tempo de execução Empacota um objeto, o objeto é fixado para a duração da plataforma chama chamadas para garantir que o coletor de lixo não disponível ou mover o objeto.
Uso de memória
Use as diretrizes a seguir para manipular memória com código não gerenciado no .NET Compact Framework:
Sempre alocar memória em código gerenciado e depois passar para código não gerenciado.
Se código não gerenciado contém um ponteiro para um componente gerenciado, você deve manualmente marcar o objeto usando o GCHandle estrutura.
The .NET Compact Framework Common linguagem tempo de execução coinitializes threads na inicialização e co-finaliza eles no desligado. Threads são marcados sistema autônomo "threading disponível".