Konvertieren importierter Member

In diesem Abschnitt wird die Konvertierung der folgenden Member durch den Importvorgang beschrieben:

  • Methoden

  • Eigenschaften

  • Ereignisse

Tlbimp.exe wendet das DefaultMemberAttribute auf jede Methode oder Eigenschaft mit einer DispID von 0 (null) an. C#-Entwickler müssen diese Member als Arrays behandeln. Weitere Informationen finden Sie in der Dokumentation zur Programmiersprache.

Methoden

Beim Importieren eines COM-Typs durch COM-Interop wird eine .NET Framework-Methodensignatur erstellt, die äquivalent zur ursprünglichen COM-Methodensignatur ist. Während des Konvertierungsprozesses werden COM-Parameter, Rückgabewerte und HRESULTs zu ihren Entsprechungen in der .NET Framework-Methodensignatur zugeordnet, wie in der folgenden Abbildung gezeigt wird.

Konvertierung der Methodensignatur

Konvertierung der Methodensignatur

Sie können die Methodensyntax mithilfe einer Objektansicht oder unter Verwendung von Reflektion untersuchen, so wie bei jeder anderen .NET-Klasse. Wenn das COM-Objekt den Fehler HRESULT zurückgibt, löst die Laufzeit standardmäßig eine entsprechende Ausnahme aus.

Eigenschaften

Ein COM-Entwickler kann Eigenschaften und Methoden für Schnittstellen deklarieren. Alle Eigenschaften verfügen über entsprechende Accessormethoden zum Einstellen oder Abrufen der Eigenschaftswerte. Wird durch den Importvorgang eine Typbibliotheksbeschreibung einer Schnittstelle mit Eigenschaften in Metadaten konvertiert, werden eine Eigenschaft sowie eine oder mehrere Accessormethoden für diese Eigenschaft erstellt.

Die Accessormethoden der Eigenschaften werden durch den Konvertierungsprozess der Typbibliothek auf folgende Weise umgewandelt:

  • Eigenschaften mit dem [propget]-Attribut werden zu verwalteten Eigenschaften desselben Typs mit einer entsprechenden Methode, die get_propertyname genannt wird.

  • Eigenschaften mit dem [propput]-Attribut oder dem [propputref]-Attribut werden zu verwalteten Eigenschaften desselben Typs mit einer entsprechenden Methode, die set_propertyname genannt wird.

  • Eigenschaften mit dem [propput]-Attribut und dem [propputref]-Attribut werden zu:

    • Verwalteten Eigenschaften desselben Typs wie das [propputref]-Attribut mit einer entsprechenden Methode, die set_propertyname genannt wird.

    • Einer anderen Accessormethode desselben Typs wie das [propput]-Attribut, genannt let_propertyname.

In der folgenden Typbibliothek werden die ursprünglichen Eigenschaften gezeigt.

Typbibliothekdarstellung

interface ISample : IDispatch {
    [propget]    HRESULT prop1([out, retval] short *pVal);
    [propput]    HRESULT prop1([in] short newVal);

    [propget]    HRESULT prop2([out, retval] INew **pVal);
    [propputref] HRESULT prop2([in] INew *newVal);

    [propget]    HRESULT prop3([out, retval] INew **ppINew);
    [propput]    HRESULT prop3([in] BSTR text);
    [propputref] HRESULT prop3([in] INew *pINew);
}

Die konvertierten Eigenschaften werden im folgenden Visual Basic 2005-Codefragment angezeigt.

Public Property 
    Get Prop1() As Integer … End Get    
    Set Prop1(val as Integer) … End Set
End Property

Public Property 
    Get Prop2() As INew … End Get 
    Set Prop2(val as INew) … End Set
End Property

Public Property
    Get Prop3() As INew … End Get 
    Set Prop3(val as INew) … End Set 
End Property

Public let_prop3(String as Text)

Ereignisse

Schnittstellen für Ereignisse können von einer COM-Typbibliothek definiert werden. Eine Co-Klasse, die Ereignisse hervorruft, kann innerhalb der Bibliothek durch Festlegen des [source]-Attributs die Ereignisschnittstelle identifizieren. Eine Ereignissenke implementiert die Schnittstelle, und die Ereignisquelle verarbeitet sie. Die COM-Verbindungspunktschnittstellen, die nicht in der Typbibliothek beschrieben sind, stellen die Verbindung zwischen Ereignissenke und -quelle her.

Im folgenden IDL-Codebeispiel implementiert die Button-Klasse die IButton-Schnittstelle und ist die Quelle von Ereignissen für die IButtonEvents-Schnittstelle.

interface IButton {
    HRESULT Init();
}

interface IButtonEvents {
    HRESULT Click([in] int x, [in] int y);
    HRESULT Resize([out, retval] int *pRetval};
}

coclass Button {
    [default] interface IButton;
    [default, source] interface IButtonEvents;
}

Das .NET-Ereignismodell unterscheidet sich erheblich vom COM-Verbindungspunktmodell. Die verwalteten Klassen, die Ereignisse empfangen, übergeben dabei der Ereignisquelle ein Delegat, anstatt COM-Verbindungspunkte zu verwenden. Der COM-Interop-Dienst überbrückt diese beiden unterschiedlichen Ereignismodelle.

Während des Importierens erstellt Tlbimp.exe verschiedene Typen. Damit kann eine verwaltete Anwendung Ereignisse empfangen, deren Quelle unverwaltete, das .NET-Ereignismodell verwendende Klassen sind. Tlbimp.exe generiert Klassen und Schnittstellen für die im vorhergehenden Beispiel gezeigte Button-Klasse in folgenden Schritten.

  1. Der Importvorgang erstellt einen Delegattyp für jedes Ereignis in der Ereignisschnittstelle. Delegatnamen bestehen aus der Ereignissenken-Schnittstelle, einem Unterstrich, dem Ereignisnamen und dem Wort "EventHandler". In der Typbibliothek des vorhergehenden Beispiels wird das Click-Ereignis zum IButtonEvents_ClickEventHandler-Delegaten.

    ' A delegate for each event.
    Delegate Sub IButtonEvents_ClickEventHandler(ByVal x As Integer, _
             ByVal y As Integer)
    Delegate Function IButtonEvents_ResizeEventHandler() As Integer
    
    // A delegate for each event.
    delegate void IButtonEvents_ClickEventHandler(int x, int y);
    delegate int IButtonEvents_ResizeEventHandler();
    

    Beachten Sie, dass die Signatur des Delegats eine direkte Übersetzung der Signatur der nicht verwalteten Methode ist.

  2. Tlbimp.exe importiert die Standardschnittstelle auf die übliche Weise, wobei der Name der Schnittstelle unverändert bleibt. In diesem Beispiel heißt die Schnittstelle IButton.

    ' Direct import of original default interface.
    Public Interface IButton
        Sub Init()
    End Interface
    
    // Direct import of original default interface. 
    public interface IButton {
        void Init();
    }
    
  3. Tlbimp.exe importiert die Ereignisschnittstelle auf die übliche Weise, wobei der Name der Schnittstelle unverändert bleibt. In diesem Beispiel heißt die Schnittstelle IButtonEvent.

    ' Direct import of original event interface. 
    ' Not of interest to managed sinks.
    Public Interface IButtonEvents
        Sub Click(ByVal x As Integer, ByVal y As Integer)
        Function Resize() As Integer
    End Interface
    
    // Direct import of original event interface.
    // Not of interest to managed sinks.
    public interface IButtonEvents {
        void Click(int x, int y);
        int Resize();
    }
    
  4. Tlbimp.exe erstellt außerdem eine zweite Ereignisschnittstelle, die den durch das Suffix "_Event" ergänzten Namen der ursprünglichen Schnittstelle trägt. Die Member dieser zweiten Ereignisschnittstelle sind das Click-Ereignis und das Resize-Ereignis. Außerdem sind eine add-Methode und eine remove-Methode für die Ereignisdelegaten enthalten. In diesem Beispiel trägt die Schnittstelle die Bezeichnung IButtonEvents_Event.

    ' Modified version of the event interface with events
    ' for managed sinks.
    
    Public Interface IButtonEvents_Event
            Sub Click As IButtonEvents_Click
            Function Resize() As IButtonEvents_Resize
            Sub add_Click(ByVal Click As IButtonEvents_ClickEventHandler)
            Sub remove_Click(ByVal Click As _
                   IButtonEvents_ClickEventHandler)
            Sub add_Resize(ByVal Resize As _
                   IButtonEvents_ResizeEventHandler)
            Sub remove_Resize(ByVal Resize As _
                   IButtonEvents_ResizeEventHandler)
        End Interface
    // Modified version of the event interface with events 
    // for managed sinks.
    public interface IButtonEvents_Event {
       IButtonEvents_Click Click;
       IButtonEvents_Resize Resize;
       void add_Click(IButtonEvents_ClickEventHandler );
       void remove_Click(IButtonEvents_ClickEventHandler );
       void add_Resize(IButtonEvents_ResizeEventHandler );
       void remove_Resize(IButtonEvents_ResizeEventHandler );
    }
    
    HinweisHinweis

    Sollte in seltenen Fällen eine Umwandlung in die Ereignisschnittstelle erforderlich sein, muss die Umwandlung in die von Tlbimp.exe erstellte Schnittstelle erfolgen, nicht in die ursprüngliche Schnittstelle.So müssen Sie z. B. in IButtonEvents_Event umwandeln, nicht in IButtonEvents.

  5. Tlbimp.exe importiert die Co-Klasse, die Ereignisse auslöst, um die Einbindung aller explizit implementierten Schnittstellen sicherzustellen. Außerdem fügt es dem ursprüngliche Klassenamen "Class" hinzu. Aus der Button-Co-Klasse wird z. B. ButtonClass. Tlbimp.exe erstellt außerdem eine Co-Klassenschnittstelle mit dem Namen der Co-Klasse, die die Ereignisschnittstelle mit dem Suffix "_Event" implementiert.

    ' This is the imported coclass interface.
    ' Note the underscore in IButtonEvents_Event.
        Public Interface Button
            Inherits IButton
            Inherits IButtonEvents_Event
        End Interface
    
        Public Class ButtonClass
            Implements Button
            Implements IButton
            Implements IButtonEvents_Event
            Sub Init()
            End Sub 'Init
        End Class
    
    // This is the imported coclass interface.
    // Note the underscore in IButtonEvents_Event.
    public interface Button:IButton, IButtonEvents_Event {} 
    
    public class ButtonClass:Button,IButton,IButtonEvents_Event 
    {
    void Init(){}
    }
    

Siehe auch

Konzepte

Konvertieren importierter Bibliotheken

Konvertieren importierter Module

Konvertieren importierter Typen

Konvertieren importierter Parameter

Weitere Ressourcen

Zusammenfassung: Konvertieren einer Typbibliothek in eine Assembly