Übersicht über Marshalling

Aktualisiert: November 2007

.NET Compact Framework Version 2.0 bietet über IDispatch sowie über Plattformaufruf und vtable-Aufrufe erweiterte Unterstützung für das Marshalling. Diese Unterstützung umfasst Folgendes:

  • Verwenden des MarshalAsAttribute-Attributs.

  • Marshallen von Variantentypen, die unter Windows Embedded CE unterstützt werden.

  • Marshallen von Typen, die COM-Schnittstellen über vtable aufrufen.

  • Marshallen von Strukturen mit eingebetteten Arrays und Zeichenfolgen.

  • Angeben des Layouts für eine Struktur.

Sie können die folgenden Typen entweder als Wert oder Verweis marshallen:

  • BStr

  • IUnknown

  • IDispatch

  • SafeArray

  • DateTime (gemarshallt als OLE-DATE)

  • Variant

Beachten Sie, dass .NET Compact Framework 2.0 die AllocHGlobal-Methode und die FreeHGlobal-Methode unterstützt.

Interop-Protokollierung

Sie können Protokolldateien der Funktionssignaturen erstellen, um zu sehen, wie ein Interop-Aufruf gemarshallt wird. Informationen zum Erstellen der Dateien finden Sie unter Gewusst wie: Erstellen von Protokolldateien. Informationen zum Interpretieren der Protokolldateien finden Sie unter Protokolldateiinformationen.

Unterschiede beim Marshalling gegenüber dem vollständigen .NET Framework

.NET Compact Framework unterstützt die folgenden im vollständigen .NET Framework vorhandenen Marshalling- und Interoperabilitätsfeatures nicht:

  • Benutzerdefiniertes Marshalling

  • Abrufen eines verwalteten Delegaten aus einem systemeigenen Funktionszeiger mit der GetDelegateForFunctionPointer-Methode. Sie können jedoch einen systemeigenen Funktionszeiger aus einem verwalteten Delegaten erstellen.

  • Zugriff auf .NET Compact Framework-Klassen über systemeigene Komponenten.

  • Übergeben von Strukturen (VT_RECORD) über IDispatch.

  • Übergeben von Int64- und UInt64-Typen über IDispatch.

.NET Compact Framework weist in Bezug auf das Marshallingverhalten folgende Unterschiede zum vollständigen .NET Framework auf:

  • .NET Compact Framework ermöglicht das Marshallen von SCODE-Wertearrays; das vollständige .NET Framework jedoch nicht.

  • .NET Compact Framework marshallt Arrays von IUnknown- und IDispatch-Zeigern anders als das vollständige .NET Framework.

  • .NET Compact Framework initialisiert alle Threads als Multithread-Apartments. Andere Threadmodelle und das Festlegen eines Apartmentmodells werden nicht unterstützt. Folglich bietet .NET Compact Framework keine Unterstützung der ApartmentState-Eigenschaft oder folgender Methoden:

Marshallen mit der Declare-Anweisung in Visual Basic

Die Declare -Anweisung in Visual Basic ist eine Alternative zu declare-Verweisen auf externe Prozeduren in einer DLL. Beachten Sie, dass das Schlüsselwort Ansi in der Declare-Anweisung nicht unterstützt wird.

Das Marshalling mithilfe der Declare-Anweisung ist identisch mit dem Marshalling mithilfe der DllImportAttribute-Klasse, ausgenommen für ByVal String-Objekte. In einer Declare-Anweisung wird ein ByVal String-Parameter als Ausgabeparameter gemarshallt. Da Zeichenfolgen nicht verändert werden dürfen, zwingt dies die Common Language Runtime, die Zeichenfolge zu kopieren und einen neuen Verweis zurückzugeben.

Unterschiede zwischen IDispatch- und Plattformaufrufmarshallern

In der folgenden Tabelle werden die Typen aufgelistet, die von den beiden Marshallern unterschiedlich gemarshallt werden.

Typ

IDispatch

Plattformaufruf und vtable

String

BStr

wchar *

Object

Variant

NULL

Boolean

VARIANT_BOOL

byte

Array

SafeArray

Array im C-Format

.NET Compact Framework marshallt eine Klasse über Plattformaufruf ohne das StructLayoutAttribute als Struktur mit automatischem Layout. Das vollständige .NET Framework marshallt eine Klasse als CCW (COM Callable Wrapper).

Beachten Sie, dass .NET Compact Framework ein SafeArray mit FADF_FIXEDSIZE markiert und eine Ausnahme auslöst, wenn Sie die Größe im systemeigenen Code ändern.

In Situationen, in denen Boolean in einen systemeigenen Bytetyp übersetzt wird, kann Boolean nicht als Rückgabetyp gemarshallt werden, sondern nur als Argument.

Marshallen von Delegaten

Standardmäßig werden Delegaten als Funktionszeiger gemarshallt. Sie können auch explizit den FunctionPtr-Wert aus der UnmanagedType-Enumeration verwenden, um eine Instanz des MarshalAsAttribute zu erstellen. Beispiele finden Sie unter Marshallen von Delegaten als Funktionszeiger.

Angeben eines Zeichensatzes

Sie können das CharSet-Feld des DllImportAttribute verwenden, um beim Marshallen von Zeichenfolgen über Plattformaufruf einen Zeichensatz anzugeben.

.NET Compact Framework unterstützt die folgenden beiden Werte:

  • Auto. Zeichenfolgen werden über den entsprechenden Zeichensatz für das Betriebssystem gemarshallt, den Unicode-Zeichensatz. Dies ist der Standardwert.

  • Unicode. Zeichenfolgen werden mit dem Unicode-Zeichensatz gemarshallt.

Der Wert Ansi wird nicht unterstützt, da in Windows Embedded CE nur Unicode verwendet wird. None entspricht Ansi und wird nicht unterstützt.

Da .NET Compact Framework das ExactSpelling-Feld nicht unterstützt, sucht die Common Language Runtime gemäß den durch CharSet angegebenen Werten automatisch nach einem Einstiegspunkt.

Fixieren von Objekten

Wenn die Common Language Runtime von .NET Compact Framework ein Objekt marshallt, wird das Objekt für die Lebensdauer des Plattformaufrufs fixiert, um sicherzustellen, dass der Garbage Collector das Objekt nicht freigibt oder verschiebt.

Speichernutzung

Orientieren Sie sich an den folgenden Richtlinien für die Behandlung von Speicher mit nicht verwaltetem Code in .NET Compact Framework:

  • Ordnen Sie Speicher stets im verwalteten Code zu, und übergeben Sie ihn an nicht verwalteten Code.

  • Wenn nicht verwalteter Code einen Zeiger auf eine verwaltete Komponente enthält, müssen Sie das Objekt mit der GCHandle-Struktur manuell fixieren.

Die Common Language Runtime von .NET Compact Framework führt für Threads beim Starten CoInitialize und beim Beenden CoUninitialize aus. Die Threads werden als "Free-Threading" markiert.

Siehe auch

Aufgaben

Gewusst wie: Erstellen von Protokolldateien

Konzepte

Protokolldateiinformationen

Weitere Ressourcen

Interoperabilität in .NET Compact Framework