Appeler du code dans des compléments VSTO à partir d’autres solutions Bureau

Vous pouvez exposer un objet inclus dans votre complément VSTO à d’autres solutions, notamment d’autres solutions Microsoft Office. Cette possibilité s’avère utile si votre complément VSTO propose un service que vous voulez permettre à d’autres solutions d’utiliser. Par exemple, si vous disposez d’un complément VSTO pour Microsoft Bureau Excel qui effectue des calculs sur les données financières d’un service Web, d’autres solutions peuvent effectuer ces calculs en appelant le complément VSTO Excel au moment de l’exécution.

S’applique à : les informations contenues dans cette rubrique s’appliquent aux projets de complément VSTO. Pour plus d’informations, consultez Fonctionnalités disponibles par application Office lication et le type de projet.

Deux étapes principales constituent ce processus :

  • Dans le complément VSTO, exposez un objet à d’autres solutions.

  • Dans une autre solution, accédez à l’objet exposé par votre complément VSTO, puis appelez des membres de l’objet.

Types de solutions qui peuvent appeler du code dans un complément

Vous pouvez exposer un objet dans un complément VSTO aux types de solutions suivants :

  • Code VBA (Visual Basic pour Applications) dans un document chargé dans le même processus d’application que votre complément VSTO.

  • Personnalisations au niveau du document chargées dans le même processus d’application que votre complément VSTO.

  • Autres compléments VSTO créés à l’aide de modèles de projet Office dans Visual Studio.

  • Compléments VSTO COM (c’est-à-dire, des compléments VSTO qui implémentent l’interface IDTExtensibility2 directement).

  • Toute solution qui s’exécute dans un autre processus que votre complément VSTO (ces types de solutions sont également appelés clients hors processus). Ces solutions incluent les applications qui automatisent une application Office, comme Windows Forms ou une application console, ainsi que les compléments VSTO chargés dans un processus différent.

Exposer des objets à d’autres solutions

Pour exposer un objet inclus dans votre complément VSTO à d’autres solutions, procédez comme suit dans votre complément VSTO :

  1. Définissez une classe que vous voulez exposer à d'autres solutions.

  2. Substituez la méthode RequestComAddInAutomationService dans la classe ThisAddIn . Retournez une instance de la classe que vous voulez exposer à d'autres solutions.

Définir la classe que vous souhaitez exposer à d’autres solutions

Au minimum, la classe que vous voulez exposer doit être publique, son attribut ComVisibleAttribute doit avoir la valeur trueet elle doit exposer l'interface IDispatch .

La méthode recommandée pour exposer l'interface IDispatch consiste à procéder comme suit :

  1. Définissez une interface qui déclare les membres que vous voulez exposer à d'autres solutions. Vous pouvez définir cette interface dans votre projet de complément VSTO. Toutefois, vous pouvez la définir dans un projet de bibliothèque de classes distinct si vous voulez exposer la classe à des solutions non-VBA. Ainsi, les solutions qui appellent votre complément VSTO peuvent référencer l’interface sans référencer votre projet de complément VSTO.

  2. Appliquez l'attribut ComVisibleAttribute à cette interface, puis affectez-y la valeur true.

  3. Modifiez votre classe pour implémenter cette interface.

  4. Appliquez l’attribut ClassInterfaceAttribute à votre classe et définissez cet attribut sur la valeur None de l’énumération ClassInterfaceType .

  5. Si vous souhaitez exposer cette classe à des clients hors processus, vous devrez peut-être également effectuer les opérations suivantes :

    • Dérivez la classe de StandardOleMarshalObject. Pour plus d’informations, consultez Exposer les classes aux clients hors processus.

    • Définissez la propriété Inscrire pour COM Interop dans le projet où vous définissez l'interface. Cette propriété est nécessaire uniquement si vous souhaitez permettre aux clients d’utiliser la liaison anticipée pour appeler le complément VSTO.

    L'exemple de code suivant présente une classe AddInUtilities avec une méthode ImportData que d'autres solutions peuvent appeler. Pour afficher ce code dans le contexte d’une procédure pas à pas plus grande, consultez Procédure pas à pas : Appeler du code dans un complément VSTO à partir de VBA.

    [ComVisible(true)]
    public interface IAddInUtilities
    {
        void ImportData();
    }
    
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class AddInUtilities : IAddInUtilities
    {
        // This method tries to write a string to cell A1 in the active worksheet.
        public void ImportData()
        {
            Excel.Worksheet activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet as Excel.Worksheet;
    
            if (activeWorksheet != null)
            {
                Excel.Range range1 = activeWorksheet.get_Range("A1", System.Type.Missing);
                range1.Value2 = "This is my data";
            }
        }
    }
    

Exposer des classes à VBA

Quand vous effectuez les étapes indiquées ci-dessus, le code VBA peut uniquement appeler les méthodes que vous déclarez dans l'interface. Le code VBA ne peut pas appeler d'autres méthodes dans votre classe, notamment celles que votre classe obtient à partir des classes de base comme Object.

Vous pouvez également exposer l’interface IDispatch en définissant l’attribut ClassInterfaceAttribute sur la valeur AutoDispatch ou AutoDual de l’énumération ClassInterfaceType . Si vous exposez l’interface, vous n’avez pas besoin de déclarer les méthodes dans une interface distincte. Toutefois, le code VBA peut appeler toutes les méthodes publiques et non statiques incluses dans votre classe, notamment celles obtenues à partir des classes de base comme Object. En outre, les clients hors processus qui utilisent une liaison anticipée ne peuvent pas appeler votre classe.

Exposer des classes à des clients hors processus

Si vous voulez exposer une classe dans votre complément VSTO à des clients hors processus, vous devez dériver la classe de StandardOleMarshalObject pour faire en sorte que les clients hors processus puissent appeler votre objet de complément VSTO exposé. Sinon, les tentatives d'obtention d'une instance de votre objet exposé dans un client hors processus risquent d'échouer de manière inattendue.

Cet échec est dû au fait que tous les appels au modèle objet d’une application Office lication doivent être effectués sur le thread d’interface utilisateur principal, mais les appels d’un client hors processus à votre objet arrivent sur un thread RPC arbitraire (appel de procédure distante). Le mécanisme de marshaling COM dans le .NET Framework ne bascule pas de threads. En revanche, il essaie de marshaler l'appel à votre objet sur le thread RPC entrant au lieu du thread d'interface utilisateur principal. Si votre objet est une instance d'une classe qui dérive de StandardOleMarshalObject, les appels entrants à votre objet sont automatiquement marshalés au thread où l'objet exposé a été créé, à savoir le thread d'interface utilisateur principal de l'application hôte.

Pour plus d’informations sur l’utilisation de threads dans Bureau solutions, consultez la prise en charge de Threading dans Bureau.

Remplacer la méthode RequestComAddInAutomationService

L'exemple de code suivant montre comment remplacer RequestComAddInAutomationService dans la classe ThisAddIn de votre complément VSTO. L’exemple suppose que vous avez défini une classe nommée AddInUtilities que vous souhaitez exposer à d’autres solutions. Pour afficher ce code dans le contexte d’une procédure pas à pas plus grande, consultez Procédure pas à pas : Appeler du code dans un complément VSTO à partir de VBA.

private AddInUtilities utilities;

protected override object RequestComAddInAutomationService()
{
    if (utilities == null)
        utilities = new AddInUtilities();

    return utilities;
}

Lorsque votre complément VSTO est chargé, le runtime Visual Studio Tools pour Office appelle la RequestComAddInAutomationService méthode. Le runtime affecte l’objet retourné à la propriété COMAddIn.Object d’un COMAddIn objet qui représente votre complément VSTO. Cet objet COMAddIn est disponible pour d'autres solutions Office et pour des solutions qui automatisent Office.

Accéder aux objets à partir d’autres solutions

Pour appeler l'objet exposé dans votre complément VSTO, procédez comme suit dans la solution cliente :

  1. Obtenez l'objet COMAddIn qui représente le complément VSTO exposé. Les clients peuvent accéder à tous les compléments VSTO disponibles en utilisant la propriété Application.COMAddIns dans le modèle objet de l'application Office hôte.

  2. Accédez à la propriété COMAddIn.Object de l’objet COMAddIn . Cette propriété retourne l'objet exposé à partir du complément VSTO.

  3. Appelez les membres de l'objet exposé.

    La façon dont vous utilisez la valeur de retour de la propriété COMAddIn.Object est différente pour les clients VBA et les clients non VBA. Pour les clients hors processus, du code supplémentaire est nécessaire pour éviter une éventuelle condition de concurrence.

Accéder aux objets à partir de solutions VBA

L’exemple de code suivant montre comment utiliser VBA pour appeler une méthode exposée par un complément VSTO. Cette macro VBA appelle une méthode nommée ImportData définie dans un complément VSTO nommé ExcelImportData. Pour afficher ce code dans le contexte d’une procédure pas à pas plus grande, consultez Procédure pas à pas : Appeler du code dans un complément VSTO à partir de VBA.

Sub CallVSTOMethod()
    Dim addIn As COMAddIn
    Dim automationObject As Object
    Set addIn = Application.COMAddIns("ExcelImportData")
    Set automationObject = addIn.Object
    automationObject.ImportData
End Sub

Accéder aux objets à partir de solutions non VBA

Dans une solution non VBA, vous devez caster la valeur de la propriété COMAddIn.Object sur l’interface qu’elle implémente, puis vous pouvez appeler les méthodes exposées sur l’objet d’interface. L'exemple de code suivant montre comment appeler la méthode ImportData d'un autre complément VSTO créé à l'aide des Outils de développement Office dans Visual Studio.

object addInName = "ExcelImportData";
Office.COMAddIn addIn = Globals.ThisAddIn.Application.COMAddIns.Item(ref addInName);
ExcelImportData.IAddInUtilities utilities = (ExcelImportData.IAddInUtilities)addIn.Object;
utilities.ImportData();

Dans cet exemple, si vous essayez de convertir la valeur de la propriété COMAddIn.Object vers la AddInUtilities classe plutôt que l’interface IAddInUtilities , le code lève un InvalidCastException.