Aufrufen von Code in VSTO-Add-Ins aus anderen Office-Lösungen

Sie können ein Objekt in Ihrem VSTO-Add-In für andere Projektmappen, einschließlich anderer Microsoft Office-Projektmappen, verfügbar machen. Dies ist hilfreich, wenn Ihr VSTO-Add-In einen Dienst bereitstellt, der durch andere Projektmappen verwendet werden soll. Wenn Sie beispielsweise über ein VSTO-Add-In für Microsoft Office Excel verfügen, das Berechnungen für Finanzdaten von einem Webdienst durchführt, können andere Lösungen diese Berechnungen ausführen, indem Sie zur Laufzeit das Excel VSTO-Add-In aufrufen.

Gilt für: Die Informationen in diesem Thema gelten für VSTO-Add-In-Projekte. Weitere Informationen finden Sie unter features available by Office-App lication and project type.

In diesem Prozess gibt es zwei Hauptschritte:

  • Machen Sie in Ihrem VSTO-Add-In ein Objekt für andere Projektmappen verfügbar.

  • Greifen Sie in einer anderen Projektmappe auf das durch Ihr VSTO-Add-In verfügbar gemachtes Objekt zu, und rufen Sie Member des Objekts auf.

Typen von Lösungen, die Code in einem Add-In aufrufen können

Sie können ein Objekt in einem VSTO-Add-In für die folgenden Lösungstypen verfügbar machen:

  • Visual Basic for Applications-Code (VBA) in einem Dokument, das in demselben Anwendungsprozess wie Ihr VSTO-Add-In geladen wird.

  • Anpassungen auf Dokumentebene, die in demselben Anwendungsprozess wie Ihr VSTO-Add-In geladen werden.

  • Andere mithilfe der Office-Projektvorlagen in Visual Studio erstellten VSTO-Add-In.

  • COM-VSTO-Add-Ins (d. h. VSTO-Add-Ins, die die IDTExtensibility2 -Schnittstelle direkt implementieren).

  • Eine beliebige Projektmappe, die in einem von Ihrem VSTO-Add-In unterschiedlichen Prozess ausgeführt wird (diese Projektmappentypen werden auch als prozessexterne Clientsbezeichnet). Dazu zählen Anwendungen, die eine Office-Anwendung automatisieren, beispielsweise eine Windows Forms- oder Konsolenanwendung, sowie VSTO-Add-Ins, die in einem unterschiedlichen Prozess geladen sind.

Verfügbarmachen von Objekten für andere Lösungen

Führen Sie die folgenden Schritte in Ihrem VSTO-Add-In aus, um ein Objekt in Ihrem VSTO-Add-In für andere Projektmappen verfügbar zu machen:

  1. Definieren Sie eine Klasse, die Sie für andere Lösungen verfügbar machen möchten.

  2. Überschreiben Sie die RequestComAddInAutomationService -Methode in der ThisAddIn -Klasse. Geben Sie eine Instanz der Klasse zurück, die Sie für andere Lösungen verfügbar machen möchten.

Definieren Sie die Klasse, die Sie anderen Lösungen zur Verfügung stellen möchten.

Die verfügbar machende Klasse muss mindestens auf öffentlich festgelegt werden, wobei das Attribut ComVisibleAttribute auf truefestgelegt sein muss, und sie muss die Schnittstelle IDispatch verfügbar machen.

Sie sollten die IDispatch -Schnittstelle mithilfe der folgenden Schritte verfügbar machen:

  1. Definieren Sie eine Schnittstelle, die die Member deklariert, die Sie für andere Lösungen verfügbar machen möchten. Sie können diese Schnittstelle in Ihrem VSTO-Add-In-Projekt definieren. Sie möchten diese Schnittstelle möglicherweise jedoch in einem separaten Klassenbibliotheksprojekt definieren, wenn Sie die Klasse für VBA-fremde Projektmappen verfügbar machen möchten, sodass die Projektmappen, die Ihr VSTO-Add-In aufrufen, die Schnittstelle referenzieren können, ohne auf Ihr VSTO-Add-In-Projekt zu verweisen.

  2. Wenden Sie das Attribut ComVisibleAttribute auf diese Schnittstelle an, und legen Sie dieses Attribut auf truefest.

  3. Ändern Sie Ihre Klasse zum Implementieren dieser Schnittstelle.

  4. Wenden Sie das ClassInterfaceAttribute Attribut auf Ihre Klasse an, und legen Sie dieses Attribut auf den Wert "None" der ClassInterfaceType Enumeration fest.

  5. Wenn Sie diese Klasse für Out-of-Process-Clients verfügbar machen möchten, müssen Sie möglicherweise auch die folgenden Schritte ausführen:

    • Leiten Sie Klasse aus StandardOleMarshalObjectab. Weitere Informationen finden Sie unter Verfügbarmachen von Klassen für Out-of-Process-Clients.

    • Legen Sie die Eigenschaft Für COM-Interop registrieren im Projekt fest, in dem Sie die Schnittstelle definieren. Diese Eigenschaft ist nur erforderlich, wenn Sie Clients ermöglichen möchten, eine frühe Bindung zum Aufrufen des VSTO-Add-Ins zu verwenden.

    Das folgende Codebeispiel veranschaulicht eine AddInUtilities -Klasse mit einer ImportData -Methode, die durch andere Lösungen aufgerufen werden kann. Informationen zum Anzeigen dieses Codes im Kontext einer größeren exemplarischen Vorgehensweise finden Sie unter Walkthrough: Call code in a VSTO Add-in from 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";
            }
        }
    }
    

Verfügbarmachen von Klassen für VBA

Wenn Sie die oben aufgeführten Schritte ausführen, kann der VBA-Code nur die Methoden aufrufen, die Sie in der Schnittstelle deklarieren. Der VBA-Code kann keine anderen Methoden in Ihrer Klasse aufrufen, einschließlich der Methoden, die Ihre Klasse aus Basisklassen wie Objectabruft.

Alternativ können Sie die IDispatch-Schnittstelle verfügbar machen, indem Sie das ClassInterfaceAttribute Attribut auf den AutoDispatch- oder AutoDual-Wert der ClassInterfaceType Enumeration festlegen. Wenn Sie die Schnittstelle verfügbar machen, müssen Sie die Methoden nicht in einer separaten Schnittstelle deklarieren. Der VBA-Code kann jedoch öffentliche und nicht statische Methoden in Ihrer Klasse aufrufen, einschließlich der Methoden, die aus Basisklassen wie Objectabgerufen wurden. Zudem können prozessexterne Clients, die die frühe Bindung verwenden, Ihre Klasse nicht aufrufen.

Verfügbarmachen von Klassen für Out-of-Process-Clients

Wenn Sie eine Klasse in Ihrem VSTO-Add-In für prozessexterne Clients verfügbar machen möchten, sollten Sie die Klasse aus StandardOleMarshalObject ableiten, um sicherzustellen, dass prozessexterne Clients Ihr verfügbar gemachtes VSTO-Add-In-Objekt aufrufen können. Ansonsten treten bei Versuchen, eine Instanz Ihres verfügbar gemachten Objekts in einem prozessexternen Client abzurufen, unerwartete Fehler auf.

Dieser Fehler liegt daran, dass alle Aufrufe des Objektmodells einer Office-App lizenzierung im Standard UI-Thread erfolgen müssen, aber Aufrufe von einem Out-of-Process-Client an Ihr Objekt werden in einem beliebigen RPC-Thread (Remoteprozeduraufruf) eingehen. Der COM-Marshaling-Mechanismus in .NET Framework wechselt die Threads nicht. Vielmehr versucht er, den Aufruf für Ihr Objekt auf dem eingehenden RPC-Thread und nicht auf dem Hauptbenutzeroberflächen-Thread zu marshallen. Wenn Ihr Objekt eine Instanz einer Klasse ist, die von StandardOleMarshalObjectabstammt, werden eingehende Aufrufe für Ihr Objekt automatisch zum Thread gemarshallt, auf dem das verfügbar gemachte Objekt erstellt wurde, welcher demnach der Hauptbenutzeroberflächen-Thread der Hostanwendung ist.

Weitere Informationen zur Verwendung von Threads in Office-Lösungen finden Sie unter Threading-Unterstützung in Office.

Überschreiben der RequestComAddInAutomationService-Methode

Das folgende Codebeispiel veranschaulicht, wie RequestComAddInAutomationService in der ThisAddIn -Klasse in Ihrem VSTO-Add-In überschrieben wird. Im Beispiel wird davon ausgegangen, dass Sie eine Klasse mit dem Namen AddInUtilities definiert haben, die Sie anderen Lösungen zur Verfügung stellen möchten. Informationen zum Anzeigen dieses Codes im Kontext einer größeren exemplarischen Vorgehensweise finden Sie unter Walkthrough: Call code in a VSTO Add-in from VBA.

private AddInUtilities utilities;

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

    return utilities;
}

Wenn Ihr VSTO-Add-In geladen wird, ruft die Visual Studio-Tools für Office-Laufzeit die RequestComAddInAutomationService Methode auf. Die Laufzeit weist das zurückgegebene Objekt der COMAddIn.Object-Eigenschaft eines COMAddIn Objekts zu, das Ihr VSTO-Add-In darstellt. Dieses COMAddIn -Objektsd ist für andere Office-Lösungen verfügbar und für Lösungen, die Office automatisieren.

Zugreifen auf Objekte aus anderen Lösungen

Befolgen Sie zum Aufrufen des verfügbar gemachten Objekts in Ihrem VSTO-Add-In die folgenden Schritte in der Clientlösung:

  1. Rufen Sie das COMAddIn -Objekt ab, das für das verfügbar gemachte VSTO-Add-In steht. Clients können mithilfe der Application.COMAddIns-Eigenschaft im Objektmodell der Office-Hostanwendung auf alle verfügbaren VSTO-Add-Ins zugreifen.

  2. Greifen Sie auf die COMAddIn.Object-Eigenschaft des COMAddIn Objekts zu. Diese Eigenschaft gibt das verfügbar gemachte Objekt aus dem VSTO-Add-In zurück.

  3. Rufen Sie die Member des verfügbar gemachten Objekts auf.

    Die Art und Weise, wie Sie den Rückgabewert der COMAddIn.Object-Eigenschaft verwenden, unterscheidet sich für VBA-Clients und Nicht-VBA-Clients. Für prozessexterne Clients ist zusätzlicher Code erforderlich, um eine mögliche Racebedingung zu vermeiden.

Zugreifen auf Objekte aus VBA-Lösungen

Im folgenden Codebeispiel wird veranschaulicht, wie VBA zum Aufrufen einer Methode verwendet wird, die von einem VSTO-Add-In verfügbar gemacht wird. Dieses VBA-Makro ruft eine Methode mit dem Namen ImportData "ExcelImportData" auf, die in einem VSTO-Add-In definiert ist. Informationen zum Anzeigen dieses Codes im Kontext einer größeren exemplarischen Vorgehensweise finden Sie unter Walkthrough: Call code in a VSTO Add-in from VBA.

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

Zugreifen auf Objekte aus Nicht-VBA-Lösungen

In einer Nicht-VBA-Lösung müssen Sie den WERT der COMAddIn.Object-Eigenschaft in die von ihr implementierte Schnittstelle umwandeln und dann die verfügbar gemachten Methoden für das Schnittstellenobjekt aufrufen. Das folgende Codebeispiel veranschaulicht, wie die ImportData -Methode von einem anderen VSTO-Add-In aufgerufen wird, das mit den Office Developer Tools in Visual Studio erstellt wurde.

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

Wenn Sie in diesem Beispiel versuchen, den Wert der COMAddIn.Object-Eigenschaft in die Klasse und nicht in die AddInUtilitiesIAddInUtilities Schnittstelle zu umwandeln, löst der Code einen InvalidCastException.