Freigeben über


Anpassen von durch COM aufrufbaren Wrappern

Aktualisiert: November 2007

Das Anpassen eines COM Callable Wrappers (CCW) ist einfach. Wenn der Typ, der für einen COM-Client verfügbar gemacht werden soll, über Marshallinganforderungen verfügt, die nicht den Standardanforderungen entsprechen, muss das System.Runtime.InteropServices.MarshalAsAttribute-Attribut auf einen Methodenparameter, ein Klassenfeld oder einen Rückgabewert angewendet werden, um das Marshallingverhalten zu ändern.

Wie in der folgenden Abbildung dargestellt, können Sie eine verwaltete DLL exportieren, ohne den Wrapper anzupassen (siehe links in der Abbildung). Außerdem können Sie der Quelle Marshallinginformationen hinzufügen, um sie zu kompilieren, und den Type Library Exporter-Tool (Tlbexp.exe) verwenden, um die geänderte DLL zu exportieren und einen benutzerdefinierten Wrapper erstellen.

Marshallinginformationen in exportierten DLLs

![Type Library Exporter-Tool](images)

Hinweis:

Alle verwalteten Typen, Methoden, Eigenschaften, Felder und Ereignisse, die für COM verfügbar gemacht werden sollen, müssen öffentlich sein. Typen müssen über einen öffentlichen Standardkonstruktor verfügen, da dies der einzige Konstruktor ist, der über COM aufgerufen werden kann. Weitere Informationen finden Sie unter Qualifizieren von .NET-Typen für die Interoperation.

Beim Marshalling von Daten zwischen verwaltetem und nicht verwaltetem Code muss der Interop-Marshaller die Darstellung der übergebenen Daten erkennen:

  • Bei blitfähigen Typen sind verwaltete und nicht verwaltete Darstellungen immer gleich. Beispielsweise wird eine 4-Byte-Ganzzahl immer als 4-Byte-Ganzzahl gemarshallt. Der Interop-Marshaller verwendet die verwaltete Signatur zum Bestimmen der Datendarstellung.

  • Bei nicht blitfähigen Typen erkennt der Interop-Marshaller die verwaltete Darstellung aus deren Methodensignatur, für die nicht verwaltete Darstellung ist dies jedoch nicht möglich. Zum Marshallen von nicht blitfähigen Typen können Sie eine der folgenden Vorgehensweisen anwenden:

    • Zulassen, dass der Marshaller die Darstellung aus der verwalteten Darstellung folgert.

    • Explizites Bereitstellen der nicht verwalteten Datendarstellung.

Beispielsweise wird eine Zeichenfolge in einen BSTR-Typ konvertiert, wenn sie aus verwaltetem in nicht verwalteten Code gemarshallt wird, sofern Sie zum Marshallen der Zeichenfolge in einen anderen Typ (z. B. LPWSTR) nicht explizit MarshalAsAttribute anwenden. Sie können dieses Attribut auf einen Parameter, ein Feld oder einen Rückgabetyp innerhalb der Quelle der Typdefinition anwenden (siehe folgende Beispiele).

Anwenden des "MarshalAsAttribute" auf einen Parameter

Public Sub M1
(<MarshalAs(UnmanagedType.LPWStr)> msg As String)
public void M1
([MarshalAs(UnmanagedType.LPWStr)]String msg);

Anwenden des "MarshalAsAttribute" auf ein Feld innerhalb einer Klasse

Class MsgText
<MarshalAs(UnmanagedType.LPWStr)> Public msg As String
End Class
class MsgText {
[MarshalAs(UnmanagedType.LPWStr)] Public String msg;
}

Anwenden des "MarshalAsAttribute" auf einen Rückgabewert

Public Function M2() _
As <MarshalAs(UnmanagedType.LPWStr)> String
[return: MarshalAs(UnmanagedType.LPWStr)]
public String GetMessage();

Sie legen die System.Runtime.InteropServices.UnmanagedType-Enumeration fest, um das gewünschte Format für den nicht verwalteten Typ anzugeben. In den oben stehenden Signaturen werden msg-Daten als mit Null endende Puffer aus Unicode-Zeichen (LPWStr) gemarshallt.

Gelegentlich benötigt der Interop-Marshaller neben den im verwalteten und nicht verwalteten Datenformat bereitgestellten Informationen weitere Informationen. Beispielsweise müssen Sie zum Marshallen eines Arrays den Elementtyp, den Rang, die Größe und den Grenzwert des Arrays angeben. Mithilfe des MarshalAsAttribute können Sie die erforderlichen zusätzlichen Informationen angeben.

Siehe auch

Konzepte

COM-Datentypen

Anpassen von durch die Laufzeit aufrufbaren Wrappern

Referenz

Anpassen von durch COM aufrufbaren Wrappern

Weitere Ressourcen

Marshallen von Daten mit COM-Interop

Standardmäßiges Marshallingverhalten