他の Office ソリューションからのアプリケーション レベルのアドインのコードの呼び出し
アドイン内のオブジェクトを、他の Microsoft Office ソリューションなど、他のソリューションに公開できます。これは、作成したアドインから、他のソリューションで使用できるサービスを提供する場合に役立ちます。たとえば、Web サービスの財務データについて計算する Microsoft Office Excel のアドインがある場合、実行時に Excel アドインを呼び出すことによって、他のソリューションがこれらの計算を実行できるようになります。
対象: このトピックの情報は、Microsoft Office 2013 および Microsoft Office 2010 のアプリケーション レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
このプロセスは、主に 2 つの手順で構成されます。
アドインで、オブジェクトを他のソリューションに公開します。
他のソリューションで、アドインによって公開されたオブジェクトにアクセスし、そのオブジェクトのメンバーを呼び出します。
アドインのコードを呼び出すことができるソリューションの種類
アドインのオブジェクトは、次のような種類のソリューションに公開できます。
アドインと同じアプリケーション プロセスで読み込まれるドキュメントの Visual Basic for Applications (VBA) コード
アドインと同じアプリケーション プロセスで読み込まれるドキュメント レベルのカスタマイズ
Visual Studio で Office プロジェクト テンプレートを使用して作成した他のアドイン
COM アドイン (IDTExtensibility2 インターフェイスを直接実装するアドイン)
アドインとは別のプロセスで実行されているソリューション (このようなソリューションをアウトプロセス クライアントと呼びます)。これには、Windows フォーム、コンソール アプリケーションなどのように Office アプリケーションを自動化するアプリケーション、および別のプロセスで読み込まれているアドインが該当します。
他のソリューションへのオブジェクトの公開
アドイン内のオブジェクトを他のソリューションに公開するには、アドイン内で次の手順を実行します。
他のソリューションに公開するクラスを定義します。
ThisAddIn クラスの RequestComAddInAutomationService メソッドをオーバーライドします。他のソリューションに公開するクラスのインスタンスを返します。
他のソリューションに公開するクラスの定義
公開するクラスは、少なくともパブリックであり、ComVisibleAttribute 属性が true に設定されていて、IDispatch インターフェイスを公開する必要があります。
IDispatch インターフェイスを公開するには、次の手順を実行することを推奨します。
他のソリューションに公開するメンバーを宣言するインターフェイスを定義します。このインターフェイスは、アドイン プロジェクトで定義できます。ただし、VBA 以外のソリューションにクラスを公開する場合は、別のクラス ライブラリ プロジェクトでこのインターフェイスを定義する必要があります。そうすることで、アドインを呼び出すソリューションは、アドイン プロジェクトを参照せずに、インターフェイスを参照できます。
このインターフェイスに ComVisibleAttribute 属性を適用し、この属性を true に設定します。
このインターフェイスを実装するようにクラスを変更します。
クラスに ClassInterfaceAttribute 属性を適用し、この属性の値を ClassInterfaceType 列挙型の None 値に設定します。
アウトプロセス クライアントにクラスを公開する場合は、以下の操作も実行する必要があります。
StandardOleMarshalObject からクラスを派生させる。詳細については、「アウトプロセス クライアントへのクラスの公開」を参照してください。
インターフェイスを定義するプロジェクトの [COM 相互運用機能の登録] プロパティを設定する。この操作は、クライアントが事前バインディングを使用してアドインを呼び出すことができるようにする場合にのみ必要です。詳細については、「コンパイル プロパティの管理」を参照してください。
他のソリューションから呼び出すことができる ImportData メソッドを含む AddInUtilities クラスのコード例を次に示します。より広範なチュートリアルでこのコードを参照するには、「チュートリアル : アプリケーション レベルのアドインのコードを 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";
}
}
}
VBA へのクラスの公開
上の手順を実行した場合、VBA コードは、このインターフェイスで宣言されているメソッドのみを呼び出すことができます。VBA コードは、クラスが Object などの基本クラスから取得するメソッドを含め、クラスの他のメソッドを呼び出すことはできません。
ClassInterfaceAttribute 属性を ClassInterfaceType 列挙型の AutoDispatch 値または AutoDual 値に設定して、IDispatch インターフェイスを公開することもできます。これを行った場合、個別のインターフェイスでメソッドを宣言する必要はありません。ただし、VBA コードは、Object などの基本クラスから取得したメソッドを含め、クラスの任意のパブリックで非静的なメソッドを呼び出すことができます。また、事前バインディングを使用するアウトプロセス クライアントでは、クラスを呼び出すことができません。
アウトプロセス クライアントへのクラスの公開
アドイン内のクラスをアウトプロセス クライアントに公開する場合は、StandardOleMarshalObject からクラスを派生させて、公開されたアドイン オブジェクトをアウトプロセス クライアントが呼び出すことができるようにする必要があります。そうしないと、公開されたオブジェクトのインスタンスをアウトプロセス クライアントで取得しようとしたときに、予期しないエラーが発生する可能性があります。
これは、Office アプリケーションのオブジェクト モデルの呼び出しはすべてメイン UI スレッドで行う必要があるのに対し、アウトプロセス クライアントによるオブジェクトの呼び出しは、任意の RPC (リモート プロシージャ コール) スレッドに到達するためです。.NET Framework の COM マーシャリング機構では、スレッドの切り替えは行われません。代わりに、メイン UI スレッドではなく、受信した RPC スレッドでオブジェクトの呼び出しをマーシャリングしようとします。オブジェクトが StandardOleMarshalObject から派生したクラスのインスタンスである場合、オブジェクトに対する受信呼び出しは、公開されたオブジェクトの作成場所であるスレッドに自動的にマーシャリングされます。このスレッドは、ホスト アプリケーションのメイン UI スレッドになります。
Office ソリューションでスレッドを使用する方法の詳細については、「Office でのスレッドのサポート」を参照してください。
RequestComAddInAutomationService メソッドのオーバーライド
アドイン内の ThisAddIn クラスの RequestComAddInAutomationService をオーバーライドする方法を次のコード例に示します。この例では、他のソリューションに公開する AddInUtilities という名前のクラスが定義済みであることを前提にしています。より広範なチュートリアルでこのコードを参照するには、「チュートリアル : アプリケーション レベルのアドインのコードを 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;
}
アドインが読み込まれるときに、Visual Studio Tools for Office Runtime は RequestComAddInAutomationService メソッドを呼び出します。ランタイムは、返されたオブジェクトを、アドインを表す COMAddIn オブジェクトの Object プロパティに割り当てます。この COMAddIn オブジェクトは、他の Office ソリューション、および Office を自動化するソリューションで使用できます。
他のソリューションからのオブジェクトへのアクセス
アドインで公開されたオブジェクトを呼び出すには、クライアント ソリューションで次の手順を実行します。
公開されたアドインを表す COMAddIn オブジェクトを取得します。クライアントは、ホスト Office アプリケーションのオブジェクト モデルの Application.COMAddIns プロパティを使用して、利用可能なすべてのアドインにアクセスできます。
COMAddIn オブジェクトの Object プロパティにアクセスします。このプロパティは、アドインから公開されたオブジェクトを返します。
公開されたオブジェクトのメンバーを呼び出します。
COMAddIn.Object プロパティから返された戻り値の使用方法は、VBA クライアントの場合と VBA 以外のクライアントの場合では異なります。アウトプロセス クライアントの場合は、競合状態が発生するのを避けるために、コードを追加する必要があります。
VBA ソリューションからのオブジェクトへのアクセス
VBA を使用して、アドインで公開されたメソッドを呼び出す方法を示すコード例を次に示します。この VBA マクロは、ExcelImportData というアドインに定義されている、ImportData というメソッドを呼び出します。より広範なチュートリアルでこのコードを参照するには、「チュートリアル : アプリケーション レベルのアドインのコードを 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 以外のソリューションからのオブジェクトへのアクセス
VBA 以外のソリューションでは、COMAddIn.Object プロパティ値を、実装するインターフェイスにキャストする必要があります。これにより、インターフェイス オブジェクトで公開されているメソッドを呼び出すことができるようになります。Visual Studio の Office 開発者ツールで作成された別のアドインからの ImportData メソッドを呼び出す方法を次のコード例に示します。
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();
このコード例では、IAddInUtilities インターフェイスではなく、AddInUtilities クラスに COMAddIn.Object プロパティの値をキャストしようとすると、InvalidCastException がスローされます。
参照
処理手順
チュートリアル : アプリケーション レベルのアドインのコードを VBA から呼び出す
方法: Visual Studio で Office プロジェクトを作成する