Condividi tramite


Cenni preliminari sul marshalling

Aggiornamento: novembre 2007

In .NET Compact Framework versione 2.0 viene fornito il supporto esteso per il marshalling tramite IDispatch e tramite le chiamate a vtable e pInvoke. In tale supporto è incluso quanto segue:

  • Utilizzo dell'attributo MarshalAsAttribute.

  • Tipi di marshalling Variant supportati in Windows Embedded CE.

  • Tipi di marshalling che chiamano le interfacce COM tramite vtable.

  • Strutture di marshalling con matrici e stringhe incorporate.

  • Specifica del layout di una struttura.

È possibile eseguire il marshalling dei seguenti tipi per valore o per riferimento:

  • BStr

  • IUnknown

  • IDispatch

  • SafeArray

  • DateTime (di cui viene eseguito il marshalling come oggetto DATE OLE)

  • Variant

.NET Compact Framework 2.0 supporta i metodi AllocHGlobal e FreeHGlobal.

Registrazione per l'interoperabilità

È possibile creare file di log delle firme delle funzioni per vedere come viene eseguito il marshalling di una chiamata all'interoperabilità. Per ulteriori informazioni sulla creazione dei file di log, vedere Procedura: creare file di log. Per ulteriori informazioni sull'interpretazione dei file di log, vedere Informazioni sui file di log.

Differenze di marshalling rispetto alla versione completa di .NET Framework

In .NET Compact Framework non sono supportate le seguenti funzionalità di marshalling e interoperabilità, disponibili nella versione completa di .NET Framework:

  • Marshalling personalizzato

  • Possibilità di ottenere da un puntatore a funzione nativo un delegato gestito con il metodo GetDelegateForFunctionPointer. È tuttavia possibile creare un puntatore a funzione nativo da un delegato gestito.

  • Accesso alle classi .NET Compact Framework dai componenti nativi.

  • Passaggio delle strutture (VT_RECORD) tramite IDispatch.

  • Passaggio dei tipi Int64 e UInt64 tramite IDispatch.

.NET Compact Framework differisce dalla versione completa di .NET Framework per i comportamenti di marshalling seguenti:

  • Diversamente da .NET Framework, .NET Compact Framework consente il marshalling delle matrici di valori SCODE.

  • In .NET Compact Framework il marshalling delle matrici di puntatori IUnknown e IDispatch viene eseguito in modo diverso rispetto alla versione completa di .NET Framework.

  • In .NET Compact Framework tutti i thread vengono inizializzati come apartment con multithreading e non sono supportati altri modelli di threading né l'impostazione di un modello apartment. Di conseguenza, .NET Compact Framework non supporta la proprietà ApartmentState o i metodi seguenti:

Marshalling con l'istruzione Declare di Visual Basic

L'istruzione Declare di Visual Basic rappresenta una valida alternativa per dichiarare riferimenti a routine esterne in una DLL. La parola chiave Ansi nell'istruzione Declare non è tuttavia supportata.

Il marshalling con l'istruzione Declare è identico a quello con la classe DllImportAttribute, tranne che per gli oggetti ByVal String. In un'istruzione Declare viene eseguito il marshalling di un parametro ByVal String come parametro di output. Poiché le stringhe non possono essere modificate, Common Language Runtime deve copiare la stringa e restituire un nuovo riferimento.

Differenze tra i gestori di marshalling IDispatch e richiamo piattaforma

Nella tabella riportata di seguito sono elencati i tipi il cui marshalling viene eseguito in modo diverso dai due gestori di marshalling.

Tipo

IDispatch

Richiamo piattaforma e vtable

String

BStr

wchar *

Object

Variant

NULL

Boolean

VARIANT_BOOL

byte

Array

SafeArray

Matrice di tipo C

In .NET Compact Framework il marshalling di una classe viene eseguito tramite pInvoke senza specificare StructLayoutAttribute come struttura di layout automatico, mentre nella versione completa di .NET Framework viene eseguito come CCW (COM Callable Wrapper).

In .NET Compact Framework un tipo SafeArray viene contrassegnato con FADF_FIXEDSIZE e viene generata un'eccezione in caso di ridimensionamento nel codice nativo.

Quando Boolean viene convertito in un tipo di byte nativo, non è possibile effettuarne il marshalling come un tipo restituito, ma solo come un argomento.

Marshalling dei delegati

Per impostazione predefinita, i delegati vengono sottoposti a marshalling come puntatori a funzioni. È inoltre possibile utilizzare esplicitamente il valore FunctionPtr dell'enumerazione UnmanagedType per creare un'istanza della classe MarshalAsAttribute. Per alcuni esempi, vedere Marshalling di delegati come puntatori a funzioni.

Specifica di un set di caratteri

È possibile utilizzare il campo CharSet della classe DllImportAttribute per specificare un set di caratteri quando si esegue il marshalling di stringhe tramite il richiamo piattaforma.

.NET Compact Framework supporta i due valori seguenti:

  • Auto. Il marshalling delle stringhe viene eseguito utilizzando il set di caratteri appropriato per il sistema operativo in uso, ovvero il set di caratteri Unicode. Rappresenta il valore predefinito.

  • Unicode. Il marshalling delle stringhe viene eseguito utilizzando il set di caratteri Unicode.

Il valore Ansi non è supportato perché in Windows Embedded CE è consentito solo Unicode. None equivale a Ansi e non è supportato.

Poiché .NET Compact Framework non supporta il campo ExactSpelling, Common Language Runtime esegue una ricerca automatica di un punto di ingresso in base ai valori specificati da CharSet.

Blocco degli oggetti

Quando in .NET Compact Framework Common Language Runtime effettua il marshalling di un oggetto, l'oggetto viene bloccato per la durata della chiamata pInvoke, affinché il Garbage Collector non possa né liberare né spostare l'oggetto stesso.

Utilizzo della memoria

Per la gestione della memoria con codice non gestito in .NET Compact Framework, attenersi alle istruzioni seguenti:

  • Allocare sempre la memoria nel codice gestito e passarla al codice non gestito.

  • Qualora nel codice non gestito sia presente un puntatore a un componente gestito, è necessario bloccare manualmente l'oggetto utilizzando la struttura GCHandle.

In .NET Compact Framework i thread vengono sottoposti da Common Language Runtime al metodo Coinitialize all'avvio e al metodo Couninitialize all'arresto. I thread vengono contrassegnati come "modello di threading Free".

Vedere anche

Attività

Procedura: creare file di log

Concetti

Informazioni sui file di log

Altre risorse

Interoperabilità in .NET Compact Framework