Partager via


Conversion d'un membre importé

Cette rubrique décrit comment le processus d'importation convertit les membres suivants :

  • Méthodes

  • Propriétés

  • Événements

Tlbimp.exe applique DefaultMemberAttribute à toute méthode ou propriété avec un DispID de 0. Notez que les développeurs C# doivent traiter ces membres comme des tableaux. Pour des informations supplémentaires, consultez la documentation de votre langage de programmation.

Méthodes

Lorsque le service COM Interop importe un type COM, il produit une signature de méthode .NET Framework équivalente à celle de la méthode COM d'origine. Pendant le processus de conversion, il mappe des paramètres COM, des valeurs de retour et des HRESULT avec ceux qui figurent dans une signature de méthode .NET Framework, comme le montre l'illustration suivante.

Conversion de la signature de méthode

Conversion de la signature de méthode

Vous pouvez examiner la syntaxe de la méthode à l'aide d'un explorateur d'objets ou en faisant appel à la fonctionnalité de réflexion, comme avec n'importe quelle autre classe .NET. Par défaut, lorsque l'objet COM retourne un HRESULT d'échec, le runtime lève une exception correspondante.

Propriétés

Un développeur COM peut déclarer des propriétés et des méthodes sur des interfaces. Toutes les propriétés possèdent des méthodes d'accesseurs correspondantes pour définir ou obtenir les valeurs des propriétés. Lorsque le processus d'importation convertit une description de bibliothèque de types d'une interface avec des propriétés en métadonnées, il crée une propriété et une ou plusieurs méthodes d'accesseurs pour cette propriété.

Le processus de conversion d'une bibliothèque de types transforme les méthodes d'accesseurs de propriété selon les modes suivants :

  • Les propriétés avec l'attribut [propget] deviennent des propriétés managées du même type, avec une méthode correspondante appelée get_propertyname.

  • Les propriétés avec l'attribut [propput] ou [propputref] deviennent des propriétés managées du même type, avec une méthode correspondante appelée set_propertyname.

  • Les propriétés ayant les deux attributs [propput] et [propputref] deviennent :

    • Des propriétés managées du même type que l'attribut [propputref], avec une méthode correspondante appelée set_propertyname

    • Une autre méthode d'accesseur avec le même type que l'attribut [propput], ayant le nom let_propertyname.

La bibliothèque de types suivante montre les propriétés d'origine.

Représentation de la bibliothèque de types

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);
}

Les propriétés converties apparaissent dans le fragment de code Visual Basic 2005 suivant.

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)

Événements

Une bibliothèque de types COM peut définir des interfaces utilisées pour les événements. Dans la bibliothèque, une coclasse qui génère des événements peut identifier l'interface d'événement en spécifiant l'attribut [source]. Un récepteur d'événements implémente l'interface et une source d'événements la consomme. Les interfaces de points de connexion COM, qui ne sont pas décrites dans la bibliothèque de types, connectent le récepteur d'événements à la source d'événements.

Dans l'exemple de code IDL suivant, la classe Button implémente l'interface IButton et génère les événements sur l'interface IButtonEvents.

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;
}

Le modèle d'événement .NET diffère considérablement du modèle point de connexion COM. Les classes managées qui reçoivent des événements agissent de la sorte en passant un délégué à la source d'événements, au lieu d'utiliser des points de connexion COM. Le service COM Interop établit une passerelle entre ces deux modèles d'événement différents.

Pendant l'importation, Tlbimp.exe crée plusieurs types qui permettent à une application managée de recevoir des événements qui sont générés par des classes non managées utilisant le modèle d'événement .NET. Dans la procédure suivante, Tlbimp.exe génère des classes et des interfaces pour la classe Button montrée dans l'exemple précédent.

  1. Le processus d'importation crée un type délégué pour chaque événement dans l'interface d'événements. Les noms des délégués sont constitués de l'interface du récepteur d'événements, d'un trait de soulignement, du nom de l'événement et du mot EventHandler. Par exemple, dans la bibliothèque de types de l'exemple précédent, l'événement Click devient le délégué IButtonEvents_ClickEventHandler.

    ' 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();
    

    Notez que la signature du délégué est une conversion directe de la signature de la méthode non managée.

  2. Tlbimp.exe importe l'interface par défaut de manière standard, en conservant le nom de l'interface intact. Dans cet exemple, l'interface est appelée 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 importe l'interface d'événement de manière standard, en conservant le nom de l'interface intact. Dans cet exemple, l'interface est appelée 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 crée également une deuxième interface d'événement, désignée par le suffixe « _Event » ajouté au nom de l'interface d'origine. Cette deuxième interface d'événement possède les événements Click et Resize en tant que membres. Elle possède également les méthodes add et remove pour les délégués d'événements. Dans cet exemple, l'interface est appelée 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 );
    }
    
    RemarqueRemarque

    Dans le cas exceptionnel où vous devez effectuer un cast en interface d'événement, faites-le dans l'interface produite par Tlbimp.exe plutôt que dans l'interface d'origine.Par exemple, vous devez effectuer un cast en IButtonEvents_Event, pas en IButtonEvents.

  5. Tlbimp.exe importe la coclasse qui génère des événements pour garantir l'inclusion de toutes les interfaces implémentées de manière explicite et il ajoute Classe au nom de la classe d'origine. Par exemple, la coclasse Button devient ButtonClass. Tlbimp.exe génère également une interface de coclasse avec le même nom que la coclasse, qui implémente l'interface d'événements avec le suffixe _Event.

    ' 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(){}
    }
    

Voir aussi

Concepts

Conversion d'une bibliothèque importée

Conversion d'un module importé

Conversion d'un type importé

Conversion d'un paramètre importé

Autres ressources

Résumé de la conversion d'une bibliothèque de types en assembly