Freigeben über


Anpassen von COM-Aufrufwrappern

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

HinweisHinweis

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)
    ' ...
End Sub
void M1([MarshalAs(UnmanagedType.LPWStr)] string msg)
{
    // ...
}
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 = "";
}
ref class MsgText
{
public:
    [MarshalAs(UnmanagedType::LPWStr)]
    String^ msg;

    MsgText()
    {
        msg = "";
    }
};

Anwenden des "MarshalAsAttribute" auf einen Rückgabewert

Public Function M2() As <MarshalAs(UnmanagedType.LPWStr)> String
    Dim msg As New String(New char(128){})
    ' Load message here ...
    Return msg
End Function
[return: MarshalAs(UnmanagedType.LPWStr)]
public string GetMessage()
{
    string msg = new string(new char[128]);
    // Load message here ...
    return msg;
}
[returnvalue: MarshalAs(UnmanagedType::LPWStr)]
String^ GetMessage()
{
    String^ msg = gcnew String(gcnew array<Char>(128));
    // Load message here ...
    return msg;
}

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

Referenz

Anpassen von durch COM aufrufbaren Wrappern

Konzepte

COM-Datentypen

Anpassen von Aufrufwrappern der Common Language Runtime

Weitere Ressourcen

Marshallen von Daten mit COM-Interop

Standardmarshallingverhalten