PROCÉDURE : Effectuer une liaison pour des serveurs Office Automation à l'aide de Visual C# .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 302902 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F302902
Agrandir tout | Réduire tout

Résumé

Lorsque vous automatisez une application telle qu'une application Microsoft Office, les appels aux propriétés et méthodes des objets de l'application Office doivent être connectés d'une manière ou d'une autre à ces objets. Le processus consistant à connecter les appels des propriétés et des méthodes aux objets qui mettent en oeuvre ces propriétés et ces méthodes est communément appelé liaison. Dans Visual C#, deux types de liaison sont disponibles, la liaison anticipée et la liaison tardive. Le type de liaison sélectionné peut affecter de nombreux éléments de votre programme, dont notamment les performances, la flexibilité et la facilité de maintenance.

Cet article détaille et compare la liaison anticipée et la liaison tardive pour les clients Automation Visual C# et fournit des exemples de code pour illustrer ces deux types de liaison.

Plus d'informations

Liaison anticipée

Dans le cas de la liaison anticipée, Visual C# utilise les informations de type qui sont disponibles sur l'application Office en question, afin d'effectuer une liaison directe avec les méthodes et les propriétés que le logiciel doit utiliser. Le compilateur peut effectuer des vérifications de type et de syntaxe pour garantir que les bons nombre et type de paramètres sont transmis à la méthode ou à la propriété, et que la valeur retournée est du type attendu. Comme moins de travail est requis lors de l'exécution pour appeler une propriété ou une méthode, la liaison anticipée s'avère parfois plus rapide ; toutefois, en dépit de cela, les différences de performances entre la liaison anticipée et la liaison tardive sont souvent négligeables.

La liaison anticipée présente l'inconvénient mineur de pouvoir introduire des problèmes de compatibilité entre versions. Par exemple, supposons qu'un serveur Automation tel que Microsoft Excel 2002 introduit une nouvelle méthode ou propriété qui n'était pas disponible dans Excel 2000 ou modifie une propriété ou une méthode existante. Ces modifications peuvent modifier la couche binaire de l'objet et générer des problèmes avec une application Visual C# qui utilise les informations de type Excel 2002 pour automatiser Excel 2000. Pour éviter ce type de problème avec la liaison anticipée, il est en général recommandé d'utiliser les informations de type de la version la plus récente de l'application Office que vous voulez prendre en charge lors du développement et du test de votre client Automation.

La procédure suivante décrit comment créer un client Automation qui utilise la liaison anticipée. Notez que, comme la procédure le montre, la liaison anticipée exige que vous référenciez la bibliothèque de types pour le client Automation.

Création d'un client Automation qui utilise la liaison anticipée

  1. Démarrez Microsoft Visual Studio .NET. Dans le menu Fichier, cliquez sur Nouveau, puis sur Projet. Sélectionnez Application Windows dans les types de projets Visual C#. Form1 est créé par défaut.
  2. Ajoutez une référence à la Bibliothèque d'objets Microsoft Excel. Pour ce faire, procédez comme suit :
    1. Dans le menu Projet, cliquez sur Ajouter une référence.
    2. Sous l'onglet COM, recherchez Bibliothèque d'objets Microsoft Excel, puis cliquez sur Sélectionner.

      REMARQUE : la bibliothèque d'objets Excel contient un numéro de version (9.0 pour Excel 2000 et 10.0 pour Excel 2002).
    3. Cliquez sur OK dans la boîte de dialogue Ajouter une référence pour accepter vos sélections. Si vous recevez une invite pour générer des wrappers pour les bibliothèques sélectionnées, cliquez sur Oui.
  3. Dans le menu Affichage, sélectionnez Boîte à outils pour afficher la boîte à outils et ajoutez un bouton à Form1.
  4. Double-cliquez sur Button1. La fenêtre de code du formulaire s'affiche.
  5. Dans la fenêtre de code, remplacez le code suivant
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    par :
    private void button1_Click(object sender, System.EventArgs e)
    {
    	Excel.Application objApp;
    	Excel._Workbook objBook;
    	Excel.Workbooks objBooks;
    	Excel.Sheets objSheets;
    	Excel._Worksheet objSheet;
    	Excel.Range range;
    
    	try
    	{
    		// Créer une instance d'Excel et démarrer un nouveau classeur.
    		objApp = new Excel.Application();
    		objBooks = objApp.Workbooks;
    		objBook = objBooks.Add( Missing.Value );
    		objSheets = objBook.Worksheets;
    		objSheet = (Excel._Worksheet)objSheets.get_Item(1);
    
    		range = objSheet.get_Range("A1", Missing.Value);
    
    		//Définir la valeur de la plage.
    		//EXCEL9 Utiliser :
    		range.Value = "Bonjour la Terre !";
    		//EXCEL10 Utiliser :
    		//range.set_Value(Missing.Value, "Bonjour la Terre !" );
    
    		//Rendre le contrôle d'Excel à l'utilisateur.
    		objApp.Visible = true;
    		objApp.UserControl = true;
    	}
    	catch( Exception theException ) 
    	{
    		String errorMessage;
    		errorMessage = "Erreur : ";
    		errorMessage = String.Concat( errorMessage, theException.Message );
    		errorMessage = String.Concat( errorMessage, " Ligne : " );
    		errorMessage = String.Concat( errorMessage, theException.Source );
    
    		MessageBox.Show( errorMessage, "Erreur" );
    	}
    } 
    REMARQUE : comme vous pouvez le voir, ce code utilise la bibliothèque d'objets Excel 9.0. Lorsque vous ajoutez des références à votre projet, si vous sélectionnez la bibliothèque d'objets Excel 10.0 à la place de la bibliothèque d'objets Excel 9.0, recherchez les commentaires du code qui contiennent "//Excel10" et activez la ou les lignes de code auxquelles les commentaires se rapportent. De même, recherchez dans le code les commentaires qui contiennent "//Excel9" et mettez en commentaire la ou les lignes de code auxquelles les commentaires se rapportent.

  6. par : Faites défiler la fenêtre de code jusqu'en haut. Ajoutez la ligne suivante à la fin de la liste des instructions using :
    using System.Reflection; 

Liaison tardive

Contrairement à la liaison anticipée, la liaison tardive attend le moment de l'exécution pour lier les appels des propriétés et des méthodes à leurs objets. Pour ce faire, l'objet cible doit mettre en ?uvre une interface COM spéciale : IDispatch. La méthode IDispatch::GetIDsOfNames permet à Visual C# d'interroger un objet sur les méthodes et propriétés qu'il prend en charge et la méthode IDispatch::Invoke permet alors à Visual C# d'appeler ces méthodes et propriétés. Une telle liaison tardive présente l'avantage de supprimer certaines dépendances de version inhérentes à la liaison anticipée. Toutefois, elle présente l'inconvénient de supprimer les vérifications de l'intégrité du code d'automatisation au moment de la compilation et de ne pas fournir les fonctions Intellisense qui peuvent donner des indices pour corriger les appels des méthodes et des propriétés.

Pour utiliser la liaison tardive dans Visual C#, utilisez la méthode System.Type.InvokeMember. Cette méthode appelle IDispatch::GetIDsOfNames et IDispatch::Invoke pour effectuer la liaison avec les méthodes et propriétés du serveur Automation.

Création d'un client Automation qui utilise la liaison tardive

  1. Démarrez Microsoft Visual Studio .NET. Dans le menu Fichier, cliquez sur Nouveau, puis sur Projet. Sélectionnez Application Windows dans les types de projets Visual C#. Form1 est créé par défaut.
  2. Ajoutez une référence à la Bibliothèque d'objets Microsoft Excel. Pour ce faire, procédez comme suit :
    1. Dans le menu Projet, cliquez sur Ajouter une référence.
    2. Sous l'onglet COM, recherchez Bibliothèque d'objets Microsoft Excel, puis cliquez sur Sélectionner.

      REMARQUE : la bibliothèque d'objets Excel contient un numéro de version (9.0 pour Excel 2000 et 10.0 pour Excel 2002).
    3. Cliquez sur OK dans la boîte de dialogue Ajouter une référence pour accepter vos sélections. Si vous recevez une invite pour générer des wrappers pour les bibliothèques sélectionnées, cliquez sur Oui.
  3. Dans le menu Affichage, sélectionnez Boîte à outils pour afficher la boîte à outils et ajoutez un bouton à Form1.
  4. Double-cliquez sur Button1. La fenêtre de code du formulaire s'affiche.
  5. Dans la fenêtre de code, remplacez le code suivant
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    par :
    private void button1_Click(object sender, System.EventArgs e)
    {
    	object objApp_Late;
    	object objBook_Late;
    	object objBooks_Late;
    	object objSheets_Late;
    	object objSheet_Late;
    	object objRange_Late;
    	object[] Parameters;
    
    	try
    	{
    		// Créer une instance d'Excel.
    		objApp_Late = (object)new Excel.Application();
    
    		//Obtenir la collection des classeurs.
    		objBooks_Late = objApp_Late.GetType().InvokeMember( "Workbooks", 
    		BindingFlags.GetProperty, null, objApp_Late, null );
    
    		//Ajouter un nouveau classeur.
    		objBook_Late = objBooks_Late.GetType().InvokeMember( "Add", 
    			BindingFlags.InvokeMethod, null, objBooks_Late, null );
    
    		//Obtenir la collection des feuilles de calcul.
    		objSheets_Late = objBook_Late.GetType().InvokeMember( "Worksheets",
    			BindingFlags.GetProperty, null, objBook_Late, null );
    
    		//Obtenir la première feuille de calcul.
    		Parameters = new Object[1];
    		Parameters[0] = 1;
    		objSheet_Late = objSheets_Late.GetType().InvokeMember( "Item", 
    			BindingFlags.GetProperty, null, objSheets_Late, Parameters );
    
    		//Obtenir un objet Range qui contient la cellule A1.
    		Parameters = new Object[2];
    		Parameters[0] = "A1";
    		Parameters[1] = Missing.Value;
    		objRange_Late = objSheet_Late.GetType().InvokeMember( "Range",
    			BindingFlags.GetProperty, null, objSheet_Late, Parameters );
    
    		//Écrire "Bonjour la Terre !" dans la cellule A1.
    		Parameters = new Object[1];
    		Parameters[0] = "Bonjour la Terre !";
    		objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty, 
    			null, objRange_Late, Parameters );
    
    		//Rendre le contrôle d'Excel à l'utilisateur.
    		Parameters = new Object[1];
    		Parameters[0] = true;
    		objApp_Late.GetType().InvokeMember( "Visible", BindingFlags.SetProperty,
    			null, objApp_Late, Parameters );
    		objApp_Late.GetType().InvokeMember( "UserControl", BindingFlags.SetProperty,
    			null, objApp_Late, Parameters );
    	}
    	catch( Exception theException ) 
    	{
    		String errorMessage;
    		errorMessage = "Erreur : ";
    		errorMessage = String.Concat( errorMessage, theException.Message );
    		errorMessage = String.Concat( errorMessage, " Ligne : " );
    		errorMessage = String.Concat( errorMessage, theException.Source );
    
    		MessageBox.Show( errorMessage, "Erreur" );
    	}
    }
  6. par : Faites défiler la fenêtre de code jusqu'en haut. Ajoutez la ligne suivante à la fin de la liste des instructions using :
    using System.Reflection; 

Références

Pour plus d'informations, consultez le site Web de MSDN (Microsoft Developer Network) à l'adresse suivante :
Développement Microsoft Office avec Visual Studio
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/vsofficedev.asp
Pour plus d'informations sur la liaison, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft :
245115 INFO : Utilisation de la liaison anticipée et de la liaison tardive dans Automation
244167 INFO : Écriture de clients Automation pour plusieurs versions de Office
247579 INFO : Utiliser la liaison DISPID pour automatiser les applications Office chaque fois que cela est possible

Propriétés

Numéro d'article: 302902 - Dernière mise à jour: mardi 2 mai 2006 - Version: 2.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# .NET 2002 Initiation
Mots-clés : 
_ik11561 kbaccess kbautomation kbexcel kbgrpdso kbhowto kboutlook kbword KB302902
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