他の Office ソリューションから VSTO アドイン内のコードを呼び出すCall code in VSTO Add-ins from other Office solutions

VSTO アドイン内のオブジェクトは、他の Microsoft Office ソリューションを含む、他のソリューションに公開できます。You can expose an object in your VSTO Add-in to other solutions, including other Microsoft Office solutions. このことは、VSTO アドインが他のソリューションで使用可能なサービスを含む場合に便利です。This is useful if your VSTO Add-in provides a service that you want to enable other solutions to use. たとえば、この場合は、Web サービスから受け取る財務データについて計算を実行する Microsoft Office Excel の VSTO アドインである場合は、その他のソリューションは実行時に Excel VSTO アドインを呼び出すことによってこれらの計算を実行できます。For example, if you have a VSTO Add-in for Microsoft Office Excel that performs calculations on financial data from a Web service, other solutions can perform these calculations by calling into the Excel VSTO Add-in at runtime.

適用対象: このトピックの情報は、VSTO の追加に適用されます-プロジェクト。Applies to: The information in this topic applies to VSTO Add-in projects. 詳細については、「Office アプリケーションおよびプロジェクトの種類で使用できる機能」を参照してください。For more information, see Features available by Office application and project type.

この処理には主に 2 つの手順があります。There are two main steps in this process:

  • VSTO アドインで、オブジェクトを他のソリューションに公開します。In your VSTO Add-in, expose an object to other solutions.

  • もう 1 つのソリューションで、VSTO アドインにより公開されたオブジェクトにアクセスし、オブジェクトのメンバーを呼び出します。In another solution, access the object exposed by your VSTO Add-in, and call members of the object.

アドインでコードを呼び出すことができるソリューションの種類Types of solutions that can call code in an add-in

次の種類のソリューションに VSTO アドイン内のオブジェクトを公開することができます。You can expose an object in a VSTO Add-in to the following types of solutions:

  • VSTO アドインと同じアプリケーション プロセスに読み込まれるドキュメント内の Visual Basic for Applications (VBA) コード。Visual Basic for Applications (VBA) code in a document that is loaded in the same application process as your VSTO Add-in.

  • VSTO アドインと同じアプリケーション プロセスに読み込まれるドキュメント レベルのカスタマイズ。Document-level customizations that are loaded in the same application process as your VSTO Add-in.

  • Visual Studio に含まれる Office プロジェクト テンプレートを使用して作成された他の VSTO アドイン。Other VSTO Add-ins created by using the Office project templates in Visual Studio.

  • COM VSTO アドイン (つまり、 IDTExtensibility2 インターフェイスを直接実装する VSTO アドイン)。COM VSTO Add-ins (that is, VSTO Add-ins that implement the IDTExtensibility2 interface directly).

  • VSTO アドインとは異なるプロセスで実行中の任意のソリューション (こうした種類のソリューションは アウト プロセス クライアントとも呼ばれます)。Any solution that is running in a different process than your VSTO Add-in (these types of solutions are also named out-of-process clients). これらには、Windows フォームまたはコンソール アプリケーションなど、Office アプリケーションを自動化するアプリケーションと、異なるプロセスに読み込まれる VSTO アドインが含まれます。These include applications that automate an Office application, such as a Windows Forms or console application, and VSTO Add-ins that are loaded in a different process.

他のソリューションにオブジェクトを公開Expose objects to other solutions

VSTO アドイン内のオブジェクトを他のソリューションに公開するには、VSTO アドインで次の手順を実行します。To expose an object in your VSTO Add-in to other solutions, perform the following steps in your VSTO Add-in:

  1. 他のソリューションに公開するクラスを定義します。Define a class that you want to expose to other solutions.

  2. RequestComAddInAutomationService クラスの ThisAddIn メソッドをオーバーライドします。Override the RequestComAddInAutomationService method in the ThisAddIn class. 他のソリューションに公開するクラスのインスタンスを返します。Return an instance of the class that you want to expose to other solutions.

他のソリューションに公開するクラスを定義します。Define the class you want to expose to other solutions

少なくとも、公開するクラスはパブリックであり、 ComVisibleAttribute 属性の設定は trueであり、 IDispatch インターフェイスを公開する必要があります。At a minimum, the class you want to expose must be public, it must have the ComVisibleAttribute attribute set to true, and it must expose the IDispatch interface.

IDispatch インターフェイスを公開する推奨方法は以下の手順を実行することです。The recommended way to expose the IDispatch interface is to perform the following steps:

  1. 他のソリューションに公開するメンバーを宣言するインターフェイスを定義します。Define an interface that declares the members that you want to expose to other solutions. このインターフェイスは、VSTO アドイン プロジェクトで定義できます。You can define this interface in your VSTO Add-in project. ただし、クラスを非 VBA ソリューションに公開する場合、このインターフェイスを別のクラス ライブラリ プロジェクトで定義することを推奨します。そうすることで、VSTO アドインを呼び出すソリューションは VSTO アドイン プロジェクトを参照することなく、インターフェイスを参照できます。However, you might want to define this interface in a separate class library project if you want to expose the class to non-VBA solutions, so that the solutions that call your VSTO Add-in can reference the interface without referencing your VSTO Add-in project.

  2. 適用、 ComVisibleAttribute 、このインターフェイスに属性し、この属性を設定してtrueします。Apply the ComVisibleAttribute attribute to this interface, and set this attribute to true.

  3. クラスを変更して、このインターフェイスを実装します。Modify your class to implement this interface.

  4. 適用、ClassInterfaceAttribute属性をクラスと、この属性を設定、 Noneの値、ClassInterfaceType列挙体。Apply the ClassInterfaceAttribute attribute to your class, and set this attribute to the None value of the ClassInterfaceType enumeration.

  5. このクラスをアウト プロセス クライアントに公開する場合に、次はも必要。If you want to expose this class to out-of-process clients, you might also need to do the following:

    • StandardOleMarshalObjectからクラスを派生させます。Derive the class from StandardOleMarshalObject. 詳細については、次を参照してください。クラスをアウト プロセス クライアントに公開します。For more information, see Expose classes to out-of-process clients.

    • インターフェイスを定義するプロジェクトで、 [COM の相互運用機能に登録] プロパティを設定します。Set the Register for COM interop property in the project where you define the interface. このプロパティは、事前バインディングを使用して VSTO アドインを呼び出せるにクライアントを有効にする場合にのみ必要です。This property is necessary only if you want to enable clients to use early binding to call into the VSTO Add-in.

    次のコード例は、他のソリューションによって呼び出し可能な AddInUtilities メソッドを持つ、 ImportData クラスを示します。The following code example demonstrates an AddInUtilities class with an ImportData method that can be called by other solutions. 大きなチュートリアルのコンテキストでこのコードを表示するには、次を参照してください。チュートリアル。VSTO アドイン内のコードを VBA から呼び出すします。To see this code in the context of a larger walkthrough, see 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";
            }
        }
    }
    
    <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
    

クラスを VBA に公開します。Expose classes to VBA

上記の手順を実行すると、VBA コードはインターフェイス内で宣言するメソッドのみを呼び出すことができます。When you perform the steps provided above, VBA code can call only the methods that you declare in the interface. VBA コードは、 Objectなど、クラスが基本クラスから取得するメソッドを含め、クラス内の他のメソッドを呼び出すことはできません。VBA code cannot call any other methods in your class, including methods that your class obtains from base classes such as Object.

別の方法として公開することができます、 IDispatchインターフェイスを設定して、ClassInterfaceAttribute属性の値 (autodispatch に対する) または AutoDual 値をClassInterfaceType列挙体。You can alternatively expose the IDispatch interface by setting the ClassInterfaceAttribute attribute to the AutoDispatch or AutoDual value of the ClassInterfaceType enumeration. インターフェイスを公開する場合は、個別のインターフェイスでメソッドを宣言するはありません。If you expose the interface, you do not have to declare the methods in a separate interface. ただし、VBA コードは、 Objectなど、基本クラスから取得されるメソッドを含め、クラス内の任意のパブリックおよび非静的メソッドを呼び出すことができます。However, VBA code can call any public and non-static methods in your class, including methods obtained from base classes such as Object. さらに、事前バインディングを使用するアウト プロセス クライアントはクラスを呼び出すことができません。In addition, out-of-process clients that use early binding cannot call your class.

クラスをアウト プロセス クライアントに公開します。Expose classes to out-of-process clients

VSTO アドイン内のクラスをアウト プロセス クライアントに公開する場合、 StandardOleMarshalObject からクラスを派生させ、アウト プロセス クライアントが公開された VSTO アドイン オブジェクトを呼び出せるようにする必要があります。If you want to expose a class in your VSTO Add-in to out-of-process clients, you should derive the class from StandardOleMarshalObject to ensure that out-of-process clients can call your exposed VSTO Add-in object. そうしないと、アウト プロセス クライアントで公開されたオブジェクトのインスタンスを取得しようとしたとき、予期せずに失敗する可能性があります。Otherwise, attempts to get an instance of your exposed object in an out-of-process client might fail unexpectedly.

この失敗は、Office アプリケーションのオブジェクト モデルのすべての呼び出しは、メイン UI スレッドで行う必要がありますが、アウト プロセス クライアントから、オブジェクトへの呼び出しは、任意の RPC (リモート プロシージャ コール) スレッドに到達するためです。This failure is because all calls into the object model of an Office application must be made on the main UI thread, but calls from an out-of-process client to your object will arrive on an arbitrary RPC (remote procedure call) thread. .NET Framework における COM マーシャリング機構はスレッドを切り替えず、メイン UI スレッドではなく、受信 RPC スレッド上のオブジェクトに呼び出しをマーシャリングすることを試みます。The COM marshaling mechanism in the .NET Framework will not switch threads, and it will instead attempt to marshal the call to your object on the incoming RPC thread instead of the main UI thread. オブジェクトが StandardOleMarshalObjectから派生するクラスのインスタンスである場合、オブジェクトへの受信呼び出しは、公開されたオブジェクトが作成されたスレッド、つまりホスト アプリケーションのメイン UI スレッドに自動的にマーシャリングされます。If your object is an instance of a class that derives from StandardOleMarshalObject, incoming calls to your object are automatically marshaled to the thread where the exposed object was created, which will be the main UI thread of the host application.

Office ソリューションにおけるスレッドの使用に関する詳細については、次を参照してください。のスレッドの Office でサポートします。For more information about using threads in Office solutions, see Threading support in Office.

RequestComAddInAutomationService メソッドをオーバーライドします。Override the RequestComAddInAutomationService method

次のコード例は、VSTO アドイン内の RequestComAddInAutomationService クラスで ThisAddIn をオーバーライドする方法を示します。The following code example demonstrates how to override RequestComAddInAutomationService in the ThisAddIn class in your VSTO Add-in. この例ではという名前のクラスが定義されているAddInUtilities他のソリューションに公開します。The example assumes that you have defined a class named AddInUtilities that you want to expose to other solutions. 大きなチュートリアルのコンテキストでこのコードを表示するには、次を参照してください。チュートリアル。VSTO アドイン内のコードを VBA から呼び出すします。To see this code in the context of a larger walkthrough, see 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;
}
Private utilities As AddInUtilities

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

VSTO アドインが読み込まれると、 Visual Studio Tools for Office RuntimeVisual Studio Tools for Office runtimeRequestComAddInAutomationService メソッドを呼び出します。When your VSTO Add-in is loaded, the Visual Studio Tools for Office RuntimeVisual Studio Tools for Office runtime calls the RequestComAddInAutomationService method. ランタイムは、COMAddIn.Object プロパティに、返されたオブジェクトを割り当てます、 Microsoft.Office.Core.COMAddIn VSTO アドインを表すオブジェクト。The runtime assigns the returned object to the COMAddIn.Object property of a Microsoft.Office.Core.COMAddIn object that represents your VSTO Add-in. この Microsoft.Office.Core.COMAddIn オブジェクトは他の Office ソリューションおよび Office を自動化するソリューションで利用できます。This Microsoft.Office.Core.COMAddIn object is available to other Office solutions, and to solutions that automate Office.

他のソリューションからオブジェクトにアクセスAccess objects from other solutions

VSTO アドインで公開されたオブジェクトを呼び出すには、クライアント ソリューションで以下の手順を実行します。To call the exposed object in your VSTO Add-in, perform the following steps in the client solution:

  1. 公開された VSTO アドインを表す Microsoft.Office.Core.COMAddIn オブジェクトを取得します。Get the Microsoft.Office.Core.COMAddIn object that represents the exposed VSTO Add-in. クライアントは、ホスト Office アプリケーションのオブジェクト モデル内の Application.COMAddIns プロパティを使用して、使用可能なすべての VSTO アドインにアクセスできます。Clients can access all of the available VSTO Add-ins by using the Application.COMAddIns property in the object model of the host Office application.

  2. COMAddIn.Object プロパティへのアクセス、Microsoft.Office.Core.COMAddInオブジェクト。Access the COMAddIn.Object property of the Microsoft.Office.Core.COMAddIn object. このプロパティは VSTO アドインから公開されたオブジェクトを返します。This property returns the exposed object from the VSTO Add-in.

  3. 公開されたオブジェクトのメンバーを呼び出します。Call the members of the exposed object.

    COMAddIn.Object プロパティの戻り値を使用する方法は VBA クライアントと非 VBA クライアントで異なります。The way that you use the return value of the COMAddIn.Object property is different for VBA clients and non-VBA clients. アウト プロセス クライアントの場合、可能性のある競合状態を避けるために追加のコードが必要です。For out-of-process clients, additional code is necessary to avoid a possible race condition.

VBA ソリューションからオブジェクトにアクセスAccess objects from VBA solutions

次のコード例では、VSTO アドインによって公開されるメソッドを呼び出す VBA を使用する方法を示します。The following code example demonstrates how to use VBA to call a method that is exposed by a VSTO Add-in. この VBA マクロは、という名前のメソッドを呼び出すImportDataという名前は、VSTO アドインで定義されているExcelImportDataします。This VBA macro calls a method named ImportData that is defined in a VSTO Add-in that is named ExcelImportData. 大きなチュートリアルのコンテキストでこのコードを表示するには、次を参照してください。チュートリアル。VSTO アドイン内のコードを VBA から呼び出すします。To see this code in the context of a larger walkthrough, see 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

非 VBA ソリューションからオブジェクトにアクセスAccess objects from non-VBA solutions

非 VBA ソリューションでは、それを実装するインターフェイスに COMAddIn.Object プロパティ値をキャストする必要があり、インターフェイス オブジェクトで公開されたメソッドを呼び出すことができます。In a non-VBA solution, you must cast the COMAddIn.Object property value to the interface it implements, and then you can call the exposed methods on the interface object. 次のコード例は、Visual Studio に含まれる Office Developer Tools を使用して作成された異なる VSTO アドインから ImportData メソッドを呼び出す方法を示します。The following code example demonstrates how to call the ImportData method from a different VSTO Add-in that was created by using the Office developer tools in 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();

COMAddIn.Object プロパティの値をキャストしようとする場合、この例では、AddInUtilitiesクラスではなく、IAddInUtilitiesインターフェイス、コードがスローされます、InvalidCastExceptionします。In this example, if you try to cast the value of the COMAddIn.Object property to the AddInUtilities class rather than the IAddInUtilities interface, the code will throw an InvalidCastException.

関連項目See also