Wywoływanie kodu w dodatkach na poziomie aplikacji z innych rozwiązań pakietu Office

Obiekt może ujawnić w dodatek do innych rozwiązań, w tym inne rozwiązania Microsoft Office.Jest to przydatne, jeśli dodatek zawiera to usługa, która ma zostać włączony inne rozwiązania do użycia.Na przykład jeśli dodatek dla programu Microsoft Office Excel, który wykonuje obliczenia na podstawie finansowego danych z usługi sieci Web, inne rozwiązania wykonać te obliczenia przez wywołania metody do dodatku programu Excel w czasie wykonywania.

Zastosowanie: Informacje przedstawione w tym temacie mają zastosowanie do projektów na poziomie aplikacji obsługiwanych w pakietach Microsoft Office 2013 i Microsoft Office 2010. Aby uzyskać więcej informacji, zobacz Funkcje dostępne w aplikacjach pakietu Office i typ projektu.

Istnieją dwa główne etapy tego procesu:

  • W swojej dodatku udostępnienie obiektu do innych rozwiązań.

  • W innym rozwiązaniu dostępu do obiektu uwidocznionego przez użytkownika dodatku i członków wywołania obiektu.

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

Pozwala udostępnić obiektu w dodatku następujących rozwiązań:

  • Kod Visual Basic for Applications (VBA) w dokumencie, który jest ładowany ten sam proces aplikacji jako dodatek.

  • Poziom dokumentu dostosowania, które są ładowane w tym samym procesie aplikacji jako dodatek.

  • Inne dodatki tworzony przy użyciu szablony projektów pakietu Office w programie Visual Studio.

  • Dodatki modelu COM (czyli dodatków implementujące IDTExtensibility2 bezpośrednio na interfejsie).

  • Wszelkie rozwiązanie, które jest uruchomiony w ramach innego procesu niż dodatek (tego rodzaju rozwiązań są również nazywane klientów out-of-process).Należą do aplikacji, które automatyzacji aplikacji pakietu Office, takich jak formularze systemu Windows lub aplikacji konsoli i dodatków, które są ładowane w ramach innego procesu.

Narażania obiektów do innych rozwiązań

Do udostępnienia obiektu w dodatek do innych rozwiązań, należy wykonać następujące kroki w dodatku:

  1. Definiuje klasę, która ma zostać udostępniona do innych rozwiązań.

  2. Zastąp RequestComAddInAutomationService metody w ThisAddIn klasy.Zwraca wystąpienie klasy, która ma zostać udostępniona do innych rozwiązań.

Definiowanie klasy, którą chcesz udostępnić do innych rozwiązań

Co najmniej klasy chcesz udostępnić muszą być publiczne, musi mieć ComVisibleAttribute ustawić atrybutu true, i musi ona ujawnić identyfikatorów wysyłania interfejsu.

Zalecanym sposobem udostępnienia identyfikatorów wysyłania interfejs jest można wykonać następujące czynności:

  1. Definiuje interfejs, który deklaruje elementów członkowskich, które chcesz udostępnić do innych rozwiązań.Ten interfejs można zdefiniować w projekcie dodatków.Jednak można zdefiniować ten interfejs w projekcie biblioteki klas oddzielne, jeśli chcesz udostępnić klasę do rozwiązania bez VBA, tak aby rozwiązania, które wywołują dodatku mogą się odwoływać interfejs bez odwoływania się do projektu dodatku.

  2. Zastosuj ComVisibleAttribute atrybutu do tego interfejsu, a wartość tego atrybutu true.

  3. Modyfikuj własnej klasy służące do implementacji tego interfejsu.

  4. Zastosuj ClassInterfaceAttribute atrybutu do własnej klasy, a wartość tego atrybutu None wartość ClassInterfaceType wyliczenia.

  5. Jeśli chcesz udostępnić klasę do klientów, out-of-process, konieczne może być należy wykonać następujące czynności:

    • Wyprowadzić klasę z StandardOleMarshalObject.Aby uzyskać więcej informacji, zobacz narażania klasy do klientów, Out-of-Process.

    • Ustaw zarejestrować com. właściwość w projekcie, gdzie został zdefiniowany przez interfejs.Jest to konieczne tylko, jeśli chcesz umożliwić klientom na użycie wczesnego wiązania do wywołania w dodatku.

Poniższy przykładowy kod przedstawia AddInUtilities klasy z ImportData metody, która może być wywoływany przez inne rozwiązania.Aby wyświetlić ten kod w kontekście większych przewodnik, kliknij Wskazówki: wywoływanie kodu w dodatkach na poziomie aplikacji z VBA.

<ComVisible(True)> _
Public Interface IAddInUtilities
    Sub ImportData()
End Interface

<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.None)> _
Public Class AddInUtilities
    Implements IAddInUtilities

    ' This method tries to write a string to cell A1 in the active worksheet. 
    Public Sub ImportData() Implements IAddInUtilities.ImportData

        Dim activeWorksheet As Excel.Worksheet = Globals.ThisAddIn.Application.ActiveSheet

        If activeWorksheet IsNot Nothing Then 
            Dim range1 As Excel.Range = activeWorksheet.Range("A1")
            range1.Value2 = "This is my data" 
        End If 
    End Sub 
End Class
[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";
        }
    }
}

Narażania klasy VBA

Po wykonaniu powyższych kroków kodu VBA można wywołać metody, które można zadeklarować w interfejsie.Kod VBA nie można wywołać wszystkie inne metody w klasie, w tym metody, które własnej klasy uzyskuje od klasy podstawowej, takie jak Object.

Możesz również pozwala udostępnić identyfikatorów wysyłania interfejsu przez ustawienie ClassInterfaceAttribute atrybutu do AutoDispatch lub AutoDual wartość ClassInterfaceType wyliczenia.Jeśli tak, nie trzeba do deklarowania metod w osobnym interfejsu.Jednak kod VBA może wywołać wszystkie publiczne i niestatyczną metody w klasie, w tym metody uzyskany z klasy podstawowej, takie jak Object.Ponadto out-of-process klientów, którzy użyć wczesnego wiązania nie można wywołać własnej klasy.

Narażania klasy do klientów, Out-of-Process

Jeśli chcesz udostępnić klasę w dodatek do klientów, out-of-process, powinien pochodzić z klasy StandardOleMarshalObject do zapewnienia wywołać udostępnionego obiektu dodatku out-of-process klientów.W przeciwnym razie próbuje pobrać wystąpienie obiektu narażonych w kliencie out-of-process może się nie powieść nieoczekiwanie.

Jest to spowodowane wszystkie wywołania modelu obiektów aplikacji pakietu Office muszą zostać wykonane w głównym wątku interfejsu użytkownika, ale wywołania z klienta out-of-process obiektu zostaną dostarczone w dowolnego wątku, RPC (zdalne wywoływanie procedur).Mechanizm organizowania COM w programie .NET Framework nie przełącza wątki, a zamiast tego spróbuje organizowania połączenie z obiektem w przychodzących wątku RPC zamiast głównym wątku interfejsu użytkownika.Jeśli obiekt jest wystąpieniem klasy pochodzącą z StandardOleMarshalObject, przychodzące wywołania do obiektu są automatycznie wysyłane do wątku, gdzie została utworzona udostępnionego obiektu, którego będzie głównym wątku interfejsu użytkownika aplikacji hosta.

Aby uzyskać więcej informacji o korzystaniu z wątków w rozwiązań dla pakietu Office, zobacz Obsługa wątkowości w pakiecie Office.

Zastąpienie metody RequestComAddInAutomationService

Poniższy przykładowy kod pokazuje, jak zastąpić RequestComAddInAutomationService w ThisAddIn klasy w dodatku.W tym przykładzie założono, że zdefiniowano klasę o nazwie AddInUtilities , który ma zostać udostępniona do innych rozwiązań.Aby wyświetlić ten kod w kontekście większych przewodnik, kliknij Wskazówki: wywoływanie kodu w dodatkach na poziomie aplikacji z VBA.

Private utilities As AddInUtilities

Protected Overrides Function RequestComAddInAutomationService() As Object 
    If utilities Is Nothing Then
        utilities = New AddInUtilities()
    End If 
    Return utilities
End Function
private AddInUtilities utilities;

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

    return utilities;
}

Gdy dodatek jest ładowany, Visual Studio Tools for Office Runtime wywołania RequestComAddInAutomationService metody.Środowisko uruchomieniowe przypisuje zwracany obiekt do Object właściwości COMAddIn obiekt, który reprezentuje dodatku.To COMAddIn obiekt jest dostępny do innych rozwiązań dla pakietu Office i rozwiązań, które zautomatyzować pakietu Office.

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

Aby wywołać obiekt narażonych w dodatku, w rozwiązaniu klienta należy wykonać następujące czynności:

  1. Pobierz COMAddIn obiekt, który reprezentuje narażonych dodatku.Klienci mogą uzyskiwać dostęp do wszystkich dostępnych dodatków za pomocą Application.COMAddIns właściwości w modelu obiektu hosta aplikacji pakietu Office.

  2. Dostęp do Object właściwości COMAddIn obiektu.Ta właściwość zwraca obiekt narażonych z dodatku.

  3. Wywołuje członków narażonych obiektu.

Sposób użycia wartości zwracanej przez COMAddIn.Object właściwości jest różna dla klientów VBA i bez VBA.W przypadku klientów out-of-process dodatkowe kod jest niezbędne w celu uniknięcia możliwych wyścigu.

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

Poniższy przykładowy kod pokazuje, jak używać VBA do wywołania metody uwidocznionego przez dodatek.Ta makra VBA wywołuje metodę o nazwie ImportData zdefiniowanego w dodatku o nazwie ExcelImportData.Aby wyświetlić ten kod w kontekście większych przewodnik, kliknij Wskazówki: wywoływanie kodu w dodatkach na poziomie aplikacji z 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ń bez VBA

W rozwiązaniu bez VBA, należy zrzutować COMAddIn.Object właściwości wartości do interfejsu implementuje i wywoływać metody narażonych na obiekcie interfejsu.Poniższy przykładowy kod przedstawia sposób wywołania ImportData metodę z różnych dodatek, który został utworzony przy użyciu narzędzia Office developer tools w programie Visual Studio.

Dim addIn As Office.COMAddIn = Globals.ThisAddIn.Application.COMAddIns.Item("ExcelImportData")
Dim utilities As ExcelImportData.IAddInUtilities = TryCast( _
    addIn.Object, ExcelImportData.IAddInUtilities)
utilities.ImportData()
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, przy próbie rzutowania wartość COMAddIn.Object właściwości AddInUtilities klasy zamiast IAddInUtilities interfejsu, kod zgłosi wyjątek InvalidCastException.

Zobacz też

Zadania

Wskazówki: wywoływanie kodu w dodatkach na poziomie aplikacji z VBA

Porady: tworzenie projektów Office w Visual Studio

Koncepcje

Architektura dodatków na poziomie aplikacji

Dostosowywanie funkcji interfejsu użytkownika korzystając z rozszerzalności interfejsów

Inne zasoby

Programowanie dodatków na poziomie aplikacji

Tworzenie rozwiązań pakietu Office