Aufrufen von Code in Add-Ins auf Anwendungsebene von anderen Office-Projektmappen
Sie können ein Objekt im Add-In für andere Projektmappen verfügbar machen, einschließlich anderen Microsoft Office-Projektmappen.Dies ist nützlich, wenn das Add-In einen Dienst bietet, den auch andere Lösungen nutzen sollen.Wenn Sie beispielsweise ein Add-In für Microsoft Office Excel haben, das Berechnungen für Finanzdaten von einem Webdienst durchführt, können andere Lösungen diese Berechnungen durchführen, indem sie das Excel-Add-In zur Laufzeit aufrufen.
Betrifft: Die Informationen in diesem Thema betreffen Projekte auf Anwendungsebene für Microsoft Office 2013 und Microsoft Office 2010. Weitere Informationen finden Sie unter Verfügbare Funktionen nach Office-Anwendung und Projekttyp.
Dieser Prozess umfasst zwei Hauptschritte:
Machen Sie im Add-In ein Objekt für andere Projektmappen verfügbar.
Greifen Sie in einer anderen Projektmappe auf das vom Add-In verfügbar gemachte Objekt zu, und rufen Sie Member des Objekts auf.
Typen von Projektmappen, die Code in einem Add-In aufrufen können
Sie können ein Objekt in einem Add-In für die folgenden Typen von Projektmappen verfügbar machen:
VBA (Visual Basic for Applications)-Code in einem Dokument, das in den gleichen Anwendungsprozess wie das Add-In geladen wird.
Anpassungen auf Dokumentebene, die in den gleichen Anwendungsprozess wie das Add-In geladen werden.
Andere Add-Ins, die mit den Office-Projektvorlagen in Visual Studio erstellt wurden.
COM-Add-Ins (d. h. Add-Ins, die die IDTExtensibility2-Schnittstelle direkt implementieren).
Eine beliebige Projektmappe, die in einem anderen Prozess ausgeführt wird, als das Add-In (diese Typen von Projektmappen werden auch als prozessexterne Clients bezeichnet).Dazu gehören Anwendungen, die eine Office-Anwendung automatisieren, z. B. eine Windows Forms- oder eine Konsolenanwendung, sowie Add-Ins, die in einem anderen Prozess geladen werden.
Verfügbarmachen von Objekten für andere Projektmappen
Führen Sie im Add-In die folgenden Schritte aus, um ein Objekt im Add-In für andere Projektmappen verfügbar zu machen.
Definieren Sie eine Klasse, die Sie für andere Projektmappen verfügbar machen möchten.
Überschreiben Sie die RequestComAddInAutomationService-Methode in der ThisAddIn-Klasse.Geben Sie eine Instanz der Klasse zurück, die Sie für andere Projektmappen verfügbar machen möchten.
Definieren der Klasse, die für andere Projektmappen verfügbar gemacht werden soll
Die Klasse, die verfügbar gemacht werden soll, muss zumindest öffentlich sein, über das auf true festgelegte ComVisibleAttribute-Attribut verfügen und die IDispatch-Schnittstelle verfügbar machen.
Die empfohlene Vorgehensweise zum Verfügbarmachen der IDispatch-Schnittstelle sind die folgenden Schritte:
Definieren Sie eine Schnittstelle, die die Member deklariert, die Sie für andere Projektmappen verfügbar machen möchten.Sie können diese Schnittstelle im Add-In-Projekt definieren.Sie können diese Schnittstelle ggf. in einem separaten Klassenbibliotheksprojekt definieren, wenn die Klasse für Nicht-VBA-Projektmappen verfügbar gemacht werden soll. So können die Projektmappen, die das Add-In aufrufen, auf die Schnittstelle verweisen, ohne auf das Add-In-Projekt zu verweisen.
Wenden Sie das ComVisibleAttribute-Attribut auf diese Schnittstelle an, und legen Sie das Attribut auf true fest.
Ändern Sie die Klasse, um diese Schnittstelle zu implementieren.
Wenden Sie das ClassInterfaceAttribute-Attribut auf die Klasse an, und legen Sie dieses Attribut auf den None-Wert der ClassInterfaceType-Enumeration fest.
Wenn Sie die Klasse für prozessexterne Clients verfügbar machen möchten, müssen Sie ggf. auch die folgenden Schritte ausführen:
Leiten Sie die Klasse von StandardOleMarshalObject ab.Weitere Informationen finden Sie unter Verfügbarmachen von Klassen für prozessexterne Clients.
Legen Sie die Eigenschaft Für COM-Interop registrieren in dem Projekt fest, in dem Sie die Schnittstelle definieren.Dies ist nur erforderlich, wenn Clients in der Lage sein sollen, das Add-In mit früher Bindung aufzurufen.Weitere Informationen finden Sie unter Verwalten von Kompilierungseigenschaften.
Das folgende Codebeispiel zeigt eine AddInUtilities-Klasse mit einer ImportData-Methode, die von anderen Projektmappen aufgerufen werden kann.Eine Darstellung dieses Codes im Kontext einer größeren exemplarischen Vorgehensweise finden Sie unter Exemplarische Vorgehensweise: Aufrufen von Code in einem Add-In auf Anwendungsebene von 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";
}
}
}
Verfügbarmachen von Klassen für VBA
Wenn Sie die obigen Schritte ausführen, können in VBA-Code nur die Methoden aufgerufen werden, die Sie in der Schnittstelle deklarieren.In VBA-Code können keine anderen Methoden in der Klasse aufgerufen werden, einschließlich Methoden, die die Klasse aus Basisklassen wie Object abruft.
Alternativ können Sie die IDispatch-Schnittstelle verfügbar machen, indem Sie das ClassInterfaceAttribute-Attribut auf den Wert AutoDispatch oder AutoDual der ClassInterfaceType-Enumeration festlegen.In diesem Fall müssen Sie die Methoden nicht in einer separaten Schnittstelle deklarieren.In VBA-Code können jedoch alle öffentlichen und nicht statischen Methoden in der Klasse aufgerufen werden, einschließlich Methoden, die aus Basisklassen wie Object abgerufen werden.Zudem können prozessexterne Clients, die frühe Bindung verwenden, die Klasse nicht aufrufen.
Verfügbarmachen von Klassen für prozessexterne Clients
Wenn Sie eine Klasse im Add-In für prozessexterne Clients verfügbar machen möchten, sollten Sie die Klasse von StandardOleMarshalObject ableiten, um sicherzustellen, dass prozessexterne Clients das verfügbar gemachte Add-In-Objekt aufrufen können.Andernfalls könnten Versuche, eine Instanz des verfügbar gemachten Objekts in einem prozessexternen Client abzurufen, unerwartet fehlschlagen.
Dies liegt daran, dass alle Aufrufe des Objektmodells einer Office-Anwendung im primären UI-Thread ausgeführt werden müssen, Aufrufe von einem prozessexternen Client jedoch an einem beliebigen RPC-Thread (Remoteprozeduraufruf) ankommen.Der COM-Marshallingmechanismus in .NET Framework schaltet nicht zwischen Threads um und versucht stattdessen, den Aufruf des Objekts beim eingehenden RPC-Thread anstelle des primären UI-Threads zu marshallen.Wenn das Objekt eine Instanz einer Klasse ist, die sich von StandardOleMarshalObject ableitet, werden eingehende Aufrufe des Objekts automatisch zu dem Thread gemarshallt, an dem das verfügbar gemachte Objekt erstellt wurde; dies ist der primäre UI-Thread der Hostanwendung.
Weitere Informationen über das Verwenden von Threads in Office-Projektmappen finden Sie unter Threading-Unterstützung in Office.
Überschreiben der RequestComAddInAutomationService-Methode
Das folgende Codebeispiel zeigt, wie RequestComAddInAutomationService in der ThisAddIn-Klasse im Add-In überschrieben wird.In diesem Beispiel wird davon ausgegangen, dass Sie eine Klasse mit dem Namen AddInUtilities definiert haben, die Sie für andere Projektmappen verfügbar machen möchten.Eine Darstellung dieses Codes im Kontext einer größeren exemplarischen Vorgehensweise finden Sie unter Exemplarische Vorgehensweise: Aufrufen von Code in einem Add-In auf Anwendungsebene von 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;
}
Wenn das 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 Object-Eigenschaft eines COMAddIn-Objekts zu, das das Add-In darstellt.Dieses COMAddIn-Objekt steht anderen Office-Projektmappen sowie Projektmappen, die Office automatisieren, zur Verfügung.
Zugreifen auf Objekte von anderen Projektmappen
Um das verfügbar gemachte Objekt im Add-In aufzurufen, führen Sie die folgenden Schritte in der Clientprojektmappe aus:
Rufen Sie das COMAddIn-Objekt ab, das das verfügbar gemachte Add-In darstellt.Clients können mit der Application.COMAddIns-Eigenschaft im Objektmodell der Office-Hostanwendung auf alle verfügbaren Add-Ins zugreifen.
Greifen Sie auf die Object-Eigenschaft des COMAddIn-Objekts zu.Diese Eigenschaft gibt das verfügbar gemachte Objekt vom Add-In zurück.
Rufen Sie die Member des verfügbar gemachten Objekts auf.
Die Art und Weise, wie Sie den Rückgabewert der COMAddIn.Object-Eigenschaft verwenden, ist für VBA-Clients und Nicht-VBA-Clients unterschiedlich.Für prozessexterne Clients ist zusätzlicher Code notwendig, um eine mögliche Racebedingung zu vermeiden.
Zugreifen auf Objekte von VBA-Projektmappen
Im folgenden Codebeispiel wird veranschaulicht, wie eine Methode, die von einem Add-In verfügbar gemacht wird, mit VBA aufgerufen wird.Dieses VBA-Makro ruft eine Methode namens ImportData auf, die in einem Add-In namens ExcelImportData definiert ist.Eine Darstellung dieses Codes im Kontext einer größeren exemplarischen Vorgehensweise finden Sie unter Exemplarische Vorgehensweise: Aufrufen von Code in einem Add-In auf Anwendungsebene von 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 von Nicht-VBA-Projektmappen
In einer Nicht-VBA-Projektmappe müssen Sie den COMAddIn.Object-Eigenschaftswert in die Schnittstelle umwandeln, die sie implementiert; anschließend können Sie die verfügbar gemachten Methoden im Schnittstellenobjekt aufrufen.Im folgenden Codebeispiel wird gezeigt, wie die ImportData-Methode in einem anderen Add-In aufgerufen wird, das mit den Office Developer Tools in Visual Studio erstellt wurde.
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();
Wenn Sie in diesem Beispiel versuchen, den Wert der COMAddIn.Object-Eigenschaft nicht in die IAddInUtilities-Schnittstelle, sondern in die AddInUtilities-Klasse umzuwandeln, wird im Code eine InvalidCastException ausgelöst.
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Aufrufen von Code in einem Add-In auf Anwendungsebene von VBA
Gewusst wie: Erstellen von Office-Projekten in Visual Studio
Konzepte
Architektur von Add-Ins auf Anwendungsebene
Anpassen von Features der Benutzeroberfläche mithilfe von Erweiterungsschnittstellen