Udostępnij za pośrednictwem


Wywołanie kodu w dodatki poziomie aplikacji z innych rozwiązań pakietu Office

Obiekt może narazić w dodatku do innych rozwiązań, w tym inne rozwiązania Microsoft Office.Jest to przydatne, jeśli Twój zapewnia usługi, które chcesz włączyć inne rozwiązania użyć.Na przykład jeśli dodatek dla programu Microsoft Office Excel wykonuje obliczenia na danych finansowych z usługi sieci Web, inne rozwiązania można wykonać te obliczenia dzwoniąc do dodatku Excel w czasie wykonywania.

Dotyczy: Informacje przedstawione w tym temacie dotyczą projektów na poziomie aplikacji dla pakietu Microsoft Office 2013 i Microsoft Office 2010. Aby uzyskać więcej informacji, zobacz Funkcje dostępne w aplikacji pakietu Office i typ projektu

Istnieją dwa główne etapy tego procesu:

  • W dodatku wystawiać obiekt do innych rozwiązań.

  • W innym rozwiązaniu dostęp obiektu narażone przez dodatek i członkowie wywołania obiektu.

Rodzaje rozwiązań, które może wywoływać kod w dodatku

Można wystawiać obiektu w dodatku do następujących typów rozwiązań:

  • Kod Visual Basic for Applications (VBA) w dokumencie, który jest ładowany w tym samym procesie stosowania jako dodatek.

  • Dostosowania poziomu dokumentu, które są ładowane w tym samym procesie stosowania jako dodatek.

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

  • Dodatki COM (oznacza to, że dodatki implementujące IDTExtensibility2 interfejsu bezpośrednio).

  • Każde rozwiązanie, którym jest uruchomiony w innym procesie niż dodatek (rozwiązania tego typu są również nazywane Klienci out-of-process).Należą do aplikacji, które automatyzują aplikacji pakietu Office, takich jak Windows Forms lub aplikacji konsoli i dodatki, które są ładowane w innym procesie.

Wystawiając obiektów do innych rozwiązań

Aby odsłonić obiektu w dodatku do innych rozwiązań, wykonaj następujące czynności w dodatku:

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

  2. Zastąpić RequestComAddInAutomationService metoda w ThisAddIn klasy.Zwraca wystąpienie klasy, który chcesz udostępnić do innych rozwiązań.

Bb608621.collapse_all(pl-pl,VS.110).gifDefiniowanie klasy, który chcesz udostępnić do innych rozwiązań

Co najmniej klasy chcesz wystawiać muszą być publiczne, musi on mieć ComVisibleAttribute atrybut ustawiony na true, i należy go udostępnić interfejsu IDispatch interfejsu.

Zalecany sposób, aby odsłonić interfejsu IDispatch interfejs jest wykonać następujące czynności:

  1. Definiowanie interfejs, który deklaruje elementy, które chcesz udostępnić do innych rozwiązań.W projekcie w, można zdefiniować ten interfejs.Jednakże można zdefiniować tego interfejsu w projekcie biblioteki osobnej klasy, jeśli chcesz wystawiać klasy rozwiązania bez VBA, dzięki czemu rozwiązania, które wywołują dodatku można odwoływać się interfejs bez odwoływania się do projektu w.

  2. Zastosowanie ComVisibleAttribute atrybut do tego interfejsu, a ten atrybut true.

  3. Modyfikować klasy w celu wdrożenia tego interfejsu.

  4. Zastosowanie ClassInterfaceAttribute atrybut do klasy, a ten atrybut None wartość ClassInterfaceType wyliczenie.

  5. Jeśli chcesz wystawiać klasy klientom out-of-process, również trzeba wykonać następujące czynności:

    • Klasę z StandardOleMarshalObject.Aby uzyskać więcej informacji, zobacz Naraża klas klientom Out-of-Process.

    • Zestaw zarejestrować do współdziałania z modelem COM właściwość w programie project, gdzie możesz zdefiniować interfejs.Jest to konieczne, jeśli nie chcesz umożliwić klientom użyć wczesnego wiązania do dodatku.Aby uzyskać więcej informacji, zobacz Zarządzanie właściwościami kompilacji.

Poniższy przykład kodu pokazuje AddInUtilities klasy z ImportData metodę, która może być wywoływana przez innych rozwiązań.Aby zobaczyć ten kod w kontekście większych instruktażu, zobacz Instruktaż: Wywołanie kodu w dodatku poziomie aplikacji z języka 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";
        }
    }
}

Bb608621.collapse_all(pl-pl,VS.110).gif Wystawiając klas VBA

Po wykonaniu powyższych kroków, kod VBA można wywołać metody, które deklarują w interfejsie.Kod języka VBA nie można wywołać inne metody w klasie, w tym metody, które klasy uzyskuje klas podstawowych, takich jak Object.

Alternatywnie można wystawiać interfejsu IDispatch interfejs, przez ustawienie ClassInterfaceAttribute atrybut AutoDispatch lub AutoDual wartość ClassInterfaceType wyliczenie.Jeśli to zrobisz, nie trzeba zadeklarować metody w oddzielny interfejs.Jednak kod VBA mogą wywoływać żadnych publicznych i niestatyczny metody w klasie, w tym metody uzyskane z klas podstawowych, takich jak Object.Ponadto klienci out-of-process, którzy używają wczesnego wiązania nie można wywołać swojej klasy.

Bb608621.collapse_all(pl-pl,VS.110).gifWystawiając klas klientom Out-of-Process

Jeśli chcesz wystawiać klasy w dodatku do klientów out-of-process, powinny pochodzić klasy z StandardOleMarshalObject do zapewnienia, że klienci out-of-process można wywołać narażonych-w obiektu.W przeciwnym razie próbuje pobrać wystąpienie obiektu narażonych w kliencie out-of-process może nieoczekiwanego błędu.

Dlatego wszystkie wywołania modelu z aplikacji pakietu Office musi być wykonane w głównym wątku interfejsu użytkownika, ale wywołania przez klienta out-of-process obiektu zostaną dostarczone na temat dowolnego RPC (remote procedure call) wątku.Mechanizm kierującego COM w.NET Framework nie przełącza wątki, a zamiast tego będzie próbował MARSZAŁEK wywołanie przychodzące wątku RPC zamiast głównego wątku interfejsu użytkownika obiektu.Jeśli obiekt jest wystąpieniem klasy, która wynika z StandardOleMarshalObject, połączenia przychodzące do obiektu są automatycznie przekazywane międzyprocesowo do wątku, gdzie narażonych obiekt został utworzony, będzie główny wątek interfejsu użytkownika aplikacji hosta.

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

Bb608621.collapse_all(pl-pl,VS.110).gifMetoda RequestComAddInAutomationService

Poniższy przykład kodu demonstruje, jak zastąpić RequestComAddInAutomationService w ThisAddIn klasy w dodatku.W tym przykładzie założono, że zdefiniowano klasę o nazwie AddInUtilities , który chcesz udostępnić do innych rozwiązań.Aby zobaczyć ten kod w kontekście większych instruktażu, zobacz Instruktaż: Wywołanie kodu w dodatku poziomie aplikacji z języka 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 załadowany, Visual Studio 2010 Tools for Office Runtime wywołania RequestComAddInAutomationService metoda.Środowisko wykonawcze przypisuje zwracany obiekt do Object właściwość COMAddIn obiekt, który reprezentuje dodatku.To COMAddIn obiekt jest dostępny dla innych rozwiązań pakietu Office i rozwiązań, które automatyzują pakietu Office.

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

Wywołanie obiektu narażonych w dodatku, wykonaj następujące czynności w roztworze klienta:

  1. Pobierz COMAddIn obiekt, który reprezentuje narażonych dodatek.Klienci mogą uzyskać wszystkie dostępne dodatki dostęp za pomocą Application.COMAddIns właściwość w modelu obiektu hosta aplikacji pakietu Office.

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

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

Sposób, że używasz wartość zwracaną przez COMAddIn.Object właściwość różni się dla klientów VBA i klientów spoza VBA.Dla klientów, out-of-process dodatkowy kod jest niezbędne w celu uniknięcia możliwych wyścigu.

Bb608621.collapse_all(pl-pl,VS.110).gifUzyskiwanie dostępu do obiektów z rozwiązań VBA

Poniższy przykład kodu pokazuje, jak używać języka VBA w celu wywołania metody, ujawnianą przez dodatek.To makro VBA wywołuje metodę o nazwie ImportData zdefiniowanego w dodatek o nazwie ExcelImportData.Aby zobaczyć ten kod w kontekście większych instruktażu, zobacz Instruktaż: Wywołanie kodu w dodatku poziomie aplikacji 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

Bb608621.collapse_all(pl-pl,VS.110).gifUzyskiwanie dostępu do obiektów z rozwiązań bez VBA

W roztworze nie VBA, należy oddać COMAddIn.Object właściwość wartość do interfejsu to implementuje, a następnie można wywołać metody narażonych na obiekcie interfejs.Poniższy przykład kodu pokazuje, jak wywołać ImportData metoda od inny dodatek, który został utworzony za pomocą narzędzia dewelopera pakietu Office 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 próby oddania wartości COMAddIn.Object właściwość, aby AddInUtilities klasy a nie IAddInUtilities interfejs, kod będzie rzucić InvalidCastException.

Zobacz też

Zadania

Instruktaż: Wywołanie kodu w dodatku poziomie aplikacji z języka VBA

Jak: tworzenie projektów pakietu Office w programie Visual Studio

Koncepcje

Architektura dodatków poziomie aplikacji

Dostosowywanie funkcji interfejsu użytkownika przy użyciu interfejsów rozszerzalności

Inne zasoby

Programowanie aplikacji poziom dodatki

Tworzenie rozwiązań dla pakietu Office