Comment établir un récepteur d'événements COM dans .NET Framework avec des valeurs de retour à l'aide Visual C# .NET ou Visual C# 2005

Traductions disponibles Traductions disponibles
Numéro d'article: 811645 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Pour une version de Microsoft Visual Basic .NET de cet article, voir 810228.

Cet article se réfère à l'espace de noms bibliothèque de classes Microsoft .NET Framework suivant :
  • System.Runtime.InteropServices

Résumé

Cet article étape par étape explique comment déclarer et établir un récepteur d'événements COM en utilisant des objets de récepteur dans Visual C# .NET ou Visual C# 2005. L'exemple qui apparaît dans cet article crée un objet de récepteur qui implémente tous les événements qui sont exposés par le serveur COM. Le serveur COM utilise les valeurs de retour de plusieurs événements pour les calculs ultérieure.

Cet article décrit également les problèmes qui peuvent se produire lorsque vous utilisez un modèle de délégué où le serveur COM ne peut pas utiliser valeurs de retour de plusieurs événements.

Plus d'informations

note Cet article suppose que MySrv est un serveur COM définis par l'utilisateur est enregistré et existe sur le système. Le serveur COM expose deux événements, d'initialisation et CanShutDown . Le serveur COM utilise ces événements comme suit :
  1. Le serveur COM déclenche l'événement Initialize et puis stocke la valeur dans une variable.
  2. Le serveur COM déclenche l'événement CanShutDown et puis stocke la valeur de variable.
« Source d'événement » fait référence à et « récepteur d'événements » fait référence au client de Microsoft .NET tout au long de cet article. Pour plus d'informations, reportez-vous au site de Web Microsoft suivant :
Serveur COM
http://msdn2.microsoft.com/en-us/library/ms683835.aspx


Client Microsoft .NET utilise événements COM en utilisant des opérations suivantes :
  • Un modèle classique COM connexion point.
  • Un modèle Microsoft .NET délégué d'événement.

Modèle de point de connexion COM classique

Vous pouvez connecter à un serveur COM via COM se connecter interfaces point à partir de code géré. Toutes les classes d'événements COM fournissent l'interface IConnectionPointContainer . Lorsque vous avez l'interface IConnectionPointContainer , vous devez trouver le point de connexion spécifique de l'interface d'événement auquel vous voulez vous abonner à.
Pour utiliser le classique point de connexion modèle, procédez comme suit :
  1. Dans Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005 , cliquez sur fichier et cliquez sur Nouveau projet .
  2. Pour le type de projet , cliquez sur Visual C# . Pour le modèle , cliquez sur application console .
  3. Nom de votre projet SampleClient , puis cliquez sur OK .
  4. Dans l'Explorateur de solutions , cliquez avec le bouton droit sur Références , puis puis cliquez sur Ajouter une référence pour créer une référence à l'objet COM MySrv .
  5. Cliquez sur l'onglet COM , puis sélectionnez l'objet MySrv COM.
  6. Cliquez sur OK .
  7. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur SampleClient , puis cliquez sur Ajouter une classe pour créer la classe pour la gestion des événements.
  8. Tapez MyEventsSink.cs dans la zone de texte, cliquez sur le modèle de classe et puis cliquez sur Ouvrir .
  9. Pour établir un récepteur d'événements COM, utiliser le code suivant pour modifier la classe MyEventsSink existante :
       
        using System;
        using System.Runtime.InteropServices;
        using MySrvLib;
        class MyEventsSink  : _IMySrvEvents
        {
            public MyEventsSink (){}
            public bool CanShutDown()
            {
                Console.WriteLine("CanShutdown interface method");
                return true;
            }
    
            public bool Initialize()
            {
                Console.WriteLine("Initialize interface method");
                return true;
            }
    
        } 
  10. Dans la fonction principale de Class1.cs , utilisez la méthode FindConnectionPoint pour obtenir l'interface IConnectionPoint . Pour vous abonner à l'événement, utilisez la méthode Advise . Pour ce faire, utilisez le code suivant :
     
    using System;
    using System.Runtime.InteropServices;
    using MySrvLib;
    
    namespace SampleClient
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class Class1
        {
            /// <summary>   
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main(string[] args)
            {
                try
                {  
                    int cookie;
                    MyEventsSink  mySink;
                    mySink = new MyEventsSink  ();
                    MySrvClass  myServerClass = new MySrvClass() ;
                    UCOMIConnectionPointContainer icpc = (UCOMIConnectionPointContainer)myServerClass;
                    UCOMIConnectionPoint icp;
                    Guid IID_IMyEvents = typeof(_IMySrvEvents).GUID;
                    
                    icpc.FindConnectionPoint(ref IID_IMyEvents,out icp);
                    icp.Advise(mySink,out cookie);
    
                   //Call to server function causes events to be raised.
                    myServerClass.SetParameter ();
                    
                    icp.Unadvise(cookie);
                }
                catch(Exception ex)
                {
                    Console.WriteLine (ex.Message );
                }
                
            }
        }
    }
    

Modèle d'événement délégué Microsoft .NET


Dans le modèle de délégué, chaque fois qu'un gestionnaire d'événement est enregistré, un objet récepteur COM est créé. Pour utiliser le modèle délégué pour implémenter le récepteur de serveur MySrv , vous pouvez implémenter deux délégués. Dans le code suivant pseudo, deux gestionnaires d'événements sont enregistrés. Par conséquent, les deux objets de récepteur de COM sont créés : mySvrcClass
MySrvClass mySvrcClass;
mySvrcClass = new CTestClassClass ();

// Register first delegate
mySvrcClass.Initialize += new  _IMySrvEvents_InitializeEventHandler(this.re_Initialize);

// Register second delegate.
mySvrcClass.CanShutDown  += new  _IMySrvEvents_CanShutDownEventHandler (this.re_CanShutDown);            
...
private bool re_CanShutDown()
{
    Console.WriteLine("CanShutdown delegate")
    return true;
}
private bool re_Initialize()
{
   Console.WriteLine("Initialize delegate")
    return true;
}
...
_IMySrvEvents_CanShutDownEventHandler nouveau mySvrcClass.CanShutDown += (this.re_CanShutDown);... re_CanShutDown() bool privée {Console.WriteLine (« CanShutdown délégué ») renvoyer cette propriété a la valeur true;} re_Initialize() bool privée {Console.WriteLine (« Initialize délégué ») renvoyer cette propriété a la valeur true;}... le code pseudo client implémente les deux délégués comme deux récepteurs IMyEvents terminées :
  • Le récepteur de délégué première implémente l'événement Initialize en appelant le délégué re_Initialize . Le récepteur d'événements première fournit également l'implémentation par défaut de l'événement CanShutdown , puis renvoie false en tant que valeur par défaut.
  • Le récepteur de délégué deuxième implémente l'événement CanShutdown en appelant le délégué re_CanShutdown . Le récepteur d'événements du deuxième fournit également l'implémentation par défaut de l'événement Initialize , puis renvoie false en tant que valeur par défaut.

Des problèmes dans le .NET modèle délégué avec des valeurs de retours

Les problèmes suivants se produisent :
  • Du serveur COM déclenche l'événement Initialize pour le récepteur d'événements du premier, puis du délégué re_Initialize renvoie cette propriété a la valeur true . En outre, le serveur COM déclenche l'événement CanShutdown pour première récepteur d'événements et puis renvoie toujours la valeur par défaut false . Toutefois, le comportement attendu de l'événement CanShutdown consiste à retourner une valeur de cette propriété a la valeur true .
  • Le serveur COM déclenche l'événement Initialize pour le récepteur d'événements du deuxième et ensuite renvoie toujours la valeur par défaut false . En outre, le serveur COM déclenche l'événement CanShutdown pour récepteur second et renvoie la valeur Vrai . Toutefois, le comportement attendu de l'événement Initialize consiste à retourner une valeur de cette propriété a la valeur true .
Ces problèmes se produisent lorsque vous utilisez les valeurs de retour à partir d'événements car la source d'événements ne peut pas distinguer la valeur de retour par défaut et la valeur de retour réelle.

Modèle de délégué avec interfaces d'événements COM introduit également frais. Par exemple, si vous avez neuf méthodes dans une interface d'événement :
  1. Pour gérer toutes les méthodes de l'interface neuf, vous pouvez créer neuf délégués.
  2. Ces délégués génèrent neuf récepteurs d'événements.
  3. Si le serveur COM déclenche une seule méthode événement, le .NET framework entriez formule neuf appels aux méthodes par défaut généré.
Cependant :
  1. Sur la poignée trois méthodes neuf dans l'événement interface, vous créer trois délégués.
  2. Ces délégués génèrent trois récepteurs d'événements.
  3. Si le serveur COM déclenche une seule méthode événement, le .NET framework entriez formule trois appels aux méthodes par défaut généré.
Ce problème peut être acceptable.

Pour contourner ce problème, créer un client COM .NET en utilisant le modèle classique COM connexion point, comme décrit dans la section « Plus d'informations » de cet article.

Références

Pour plus d'informations, reportez-vous aux sites Microsoft Developer réseau MSDN (Web adresses suivantes :
COM événements
http://msdn2.microsoft.com/en-us/library/1hee64c7(vs.71).aspx
L'interopérabilité COM avancée
http://msdn2.microsoft.com/en-us/library/bd9cdfyx(vs.71).aspx
COM clients et des serveurs
http://msdn2.microsoft.com/en-us/library/ms683835.aspx
Gestion des événements déclenchés par une source de COM
http://msdn2.microsoft.com/en-us/library/66ahbe6y(vs.71).aspx

Propriétés

Numéro d'article: 811645 - Dernière mise à jour: mardi 13 novembre 2007 - Version: 2.9
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft .NET Framework 1.1
  • Microsoft Visual C# .NET 2002 Initiation
  • Microsoft Visual C# 2005 Express Edition
Mots-clés : 
kbmt kbactivexevents kbevent kbhowto KB811645 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 811645
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com