Udostępnij za pośrednictwem


Wywoływanie kodu w dodatku VSTO z innych rozwiązań pakietu Office

Możesz uwidocznić obiekt w dodatku VSTO do innych rozwiązań, w tym innych rozwiązań pakietu Microsoft Office. Jest to przydatne, jeśli dodatek VSTO udostępnia usługę, której chcesz użyć innych rozwiązań. Jeśli na przykład masz dodatek VSTO dla programu Microsoft Office Excel, który wykonuje obliczenia na danych finansowych z usługi sieci Web, inne rozwiązania mogą wykonywać te obliczenia, wywołując dodatek VSTO programu Excel w czasie wykonywania.

Dotyczy: informacje w tym temacie dotyczą projektów dodatków VSTO. Aby uzyskać więcej informacji, zobacz Funkcje dostępne przez aplikacja pakietu Office lication i typ projektu.

Ten proces obejmuje dwa główne kroki:

  • W dodatku VSTO uwidocznij obiekt innym rozwiązaniom.

  • W innym rozwiązaniu uzyskaj dostęp do obiektu uwidocznionego przez dodatek VSTO i wywołaj elementy członkowskie obiektu.

Typy rozwiązań, które mogą wywoływać kod w dodatku

Obiekt można uwidocznić w dodatku VSTO do następujących typów rozwiązań:

  • Kod języka Visual Basic for Applications (VBA) w dokumencie ładowanym w tym samym procesie aplikacji co dodatek VSTO.

  • Dostosowania na poziomie dokumentu, które są ładowane w tym samym procesie aplikacji co dodatek VSTO.

  • Inne dodatki VSTO utworzone przy użyciu szablonów projektów pakietu Office w programie Visual Studio.

  • Dodatki COM VSTO (czyli dodatki VSTO, które implementują IDTExtensibility2 interfejs bezpośrednio).

  • Każde rozwiązanie uruchomione w innym procesie niż dodatek VSTO (tego typu rozwiązania są również nazywane klientami poza procesem). Należą do nich aplikacje automatyzujące aplikacja pakietu Office licację, takie jak formularze systemu Windows lub aplikacja konsolowa, oraz dodatki VSTO ładowane w innym procesie.

Uwidaczniaj obiekty innym rozwiązaniom

Aby uwidocznić obiekt w dodatku VSTO do innych rozwiązań, wykonaj następujące kroki w dodatku VSTO:

  1. Zdefiniuj klasę, którą chcesz udostępnić innym rozwiązaniom.

  2. Zastąpi metodę RequestComAddInAutomationServiceThisAddIn w klasie . Zwróć wystąpienie klasy, którą chcesz udostępnić innym rozwiązaniom.

Zdefiniuj klasę, którą chcesz udostępnić innym rozwiązaniom

Co najmniej klasa, którą chcesz udostępnić, musi być publiczna, musi mieć ComVisibleAttribute atrybut ustawiony na wartość true i musi uwidocznić interfejs IDispatch .

Zalecanym sposobem uwidocznienia interfejsu IDispatch jest wykonanie następujących kroków:

  1. Zdefiniuj interfejs, który deklaruje elementy członkowskie, które mają być udostępniane innym rozwiązaniom. Ten interfejs można zdefiniować w projekcie dodatku VSTO. Można jednak zdefiniować ten interfejs w osobnym projekcie biblioteki klas, jeśli chcesz uwidocznić klasę w rozwiązaniach innych niż VBA, aby rozwiązania wywołujące dodatek VSTO mogły odwoływać się do interfejsu bez odwoływania się do projektu dodatku VSTO.

  2. Zastosuj atrybut do tego interfejsu ComVisibleAttribute i ustaw ten atrybut na wartość true.

  3. Zmodyfikuj klasę, aby zaimplementować ten interfejs.

  4. ClassInterfaceAttribute Zastosuj atrybut do klasy i ustaw ten atrybut na wartość ClassInterfaceType None wyliczenia.

  5. Jeśli chcesz udostępnić tę klasę klientom poza procesem, może być również konieczne wykonanie następujących czynności:

    • Utwórz pochodną klasę z StandardOleMarshalObjectklasy . Aby uzyskać więcej informacji, zobacz Udostępnianie klas klientom poza procesem.

    • Ustaw właściwość Zarejestruj dla międzyoperatoryjności modelu COM w projekcie, w którym definiujesz interfejs. Ta właściwość jest niezbędna tylko wtedy, gdy chcesz umożliwić klientom używanie wczesnego powiązania w celu wywołania dodatku VSTO.

    Poniższy przykład kodu przedstawia klasę AddInUtilitiesImportData z metodą, która może być wywoływana przez inne rozwiązania. Aby wyświetlić ten kod w kontekście większego przewodnika, zobacz Przewodnik: wywoływanie kodu w dodatku VSTO z języka 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";
            }
        }
    }
    

Uwidaczniaj klasy w języku VBA

Po wykonaniu opisanych powyżej kroków kod VBA może wywoływać tylko metody zadeklarowane w interfejsie. Kod VBA nie może wywołać żadnych innych metod w klasie, w tym metod, które klasa uzyskuje z klas bazowych, takich jak Object.

Możesz również uwidocznić interfejs IDispatch , ustawiając ClassInterfaceAttribute atrybut na wartość ClassInterfaceType AutoDispatch lub AutoDual wyliczenia. Jeśli uwidaczniasz interfejs, nie musisz deklarować metod w osobnym interfejsie. Jednak kod VBA może wywoływać dowolne publiczne i niestatyczne metody w klasie, w tym metody uzyskane z klas bazowych, takich jak Object. Ponadto klienci poza procesami korzystający z wczesnego powiązania nie mogą wywoływać klasy.

Udostępnianie klas klientom poza procesem

Jeśli chcesz uwidocznić klasę w dodatku VSTO do klientów poza procesem, należy utworzyć klasę z StandardOleMarshalObject , aby upewnić się, że klienci poza procesem mogą wywoływać uwidoczniony obiekt dodatku VSTO. W przeciwnym razie próby pobrania wystąpienia uwidocznionego obiektu w kliencie poza procesem mogą nieoczekiwanie zakończyć się niepowodzeniem.

Ten błąd jest spowodowany tym, że wszystkie wywołania modelu obiektów aplikacja pakietu Office licacji muszą być wykonywane w głównym wątku interfejsu użytkownika, ale wywołania z klienta poza procesem do obiektu będą odbierane na dowolny wątek wywołania procedury zdalnej (wywołanie procedury zdalnej). Mechanizm marshalingu COM w programie .NET Framework nie przełączy wątków i zamiast tego podejmie próbę marshalingu wywołania obiektu w przychodzącym wątku RPC zamiast głównego wątku interfejsu użytkownika. Jeśli obiekt jest wystąpieniem klasy pochodzącej z StandardOleMarshalObjectklasy , wywołania przychodzące do obiektu są automatycznie marshalowane do wątku, w którym został utworzony uwidoczniony obiekt, który będzie głównym wątkiem interfejsu użytkownika aplikacji hosta.

Aby uzyskać więcej informacji na temat używania wątków w rozwiązaniach pakietu Office, zobacz Obsługa wątków w pakiecie Office.

Zastąpij metodę RequestComAddInAutomationService

W poniższym przykładzie kodu pokazano, jak zastąpić RequestComAddInAutomationService klasę ThisAddIn w dodatku VSTO. W tym przykładzie przyjęto założenie, że zdefiniowano klasę o nazwie AddInUtilities , którą chcesz udostępnić innym rozwiązaniom. Aby wyświetlić ten kod w kontekście większego przewodnika, zobacz Przewodnik: wywoływanie kodu w dodatku VSTO z języka VBA.

private AddInUtilities utilities;

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

    return utilities;
}

Po załadowaniu dodatku VSTO środowisko uruchomieniowe Visual Studio Tools dla pakietu Office wywołuje metodę RequestComAddInAutomationService . Środowisko uruchomieniowe przypisuje zwrócony obiekt do właściwości COMAddIn.Object obiektu reprezentującego COMAddIn dodatek VSTO. Ten COMAddIn obiekt jest dostępny dla innych rozwiązań pakietu Office i rozwiązań automatyzujących pakiet Office.

Uzyskiwanie dostępu do obiektów z innych rozwiązań

Aby wywołać uwidoczniony obiekt w dodatku VSTO, wykonaj następujące kroki w rozwiązaniu klienta:

  1. COMAddIn Pobierz obiekt reprezentujący uwidoczniony dodatek VSTO. Klienci mogą uzyskać dostęp do wszystkich dostępnych dodatków VSTO przy użyciu Application.COMAddIns właściwości w modelu obiektów aplikacja pakietu Office lication hosta.

  2. Uzyskaj dostęp do właściwości COMAddIn COMAddIn.Object obiektu. Ta właściwość zwraca uwidoczniony obiekt z dodatku VSTO.

  3. Wywołaj elementy członkowskie uwidocznionego obiektu.

    Sposób użycia wartości zwracanej właściwości COMAddIn.Object różni się w przypadku klientów VBA i klientów innych niż VBA. W przypadku klientów poza procesem należy uniknąć możliwego stanu wyścigu, aby uniknąć dodatkowego kodu.

Uzyskiwanie dostępu do obiektów z rozwiązań VBA

W poniższym przykładzie kodu pokazano, jak używać języka VBA do wywoływania metody uwidocznionej przez dodatek VSTO. To makro VBA wywołuje metodę o nazwie zdefiniowaną w dodatku VSTO o nazwie ImportDataExcelImportData. Aby wyświetlić ten kod w kontekście większego przewodnika, zobacz Przewodnik: wywoływanie kodu w dodatku VSTO z języka VBA.

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

Uzyskiwanie dostępu do obiektów z rozwiązań innych niż VBA

W rozwiązaniu innych niż VBA należy rzutować wartość właściwości COMAddIn.Object na implementowany interfejs, a następnie wywołać uwidocznione metody w obiekcie interfejsu. W poniższym przykładzie kodu pokazano, jak wywołać metodę ImportData z innego dodatku VSTO utworzonego przy użyciu narzędzi deweloperskich pakietu Office w programie Visual Studio.

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

W tym przykładzie, jeśli spróbujesz rzutować wartość właściwości COMAddIn.Object na AddInUtilities klasę, a nie IAddInUtilities interfejs, kod zgłosi błąd InvalidCastException.