次の方法で共有


他の Office ソリューションからのアプリケーション レベルのアドインのコードの呼び出し

更新 : 2010 年 9 月

アドイン内のオブジェクトを、他の Microsoft Office ソリューションなど、他のソリューションに公開できます。 これは、作成したアドインから、他のソリューションで使用できるサービスを提供する場合に役立ちます。 たとえば、Web サービスの財務データについて計算する Microsoft Office Excel のアドインがある場合、実行時に Excel アドインを呼び出すことによって、他のソリューションがこれらの計算を実行できるようになります。

対象: このトピックの情報は、Microsoft Office 2010 および 2007 Microsoft Office system のアプリケーション レベルのプロジェクトに適用されます。 詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。

このプロセスは、主に 2 つの手順で構成されます。

  • アドインで、オブジェクトを他のソリューションに公開します。

  • 他のソリューションで、アドインによって公開されたオブジェクトにアクセスし、そのオブジェクトのメンバーを呼び出します。

アドインのコードを呼び出すことができるソリューションの種類

アドインのオブジェクトは、次のような種類のソリューションに公開できます。

  • アドインと同じアプリケーション プロセスで読み込まれるドキュメントの Visual Basic for Applications (VBA) コード

  • アドインと同じアプリケーション プロセスで読み込まれるドキュメント レベルのカスタマイズ

  • Visual Studio で Office プロジェクト テンプレートを使用して作成した他のアドイン

  • COM アドイン (IDTExtensibility2 インターフェイスを直接実装するアドイン)

  • アドインとは別のプロセスで実行されているソリューション (このようなソリューションをアウトプロセス クライアントと呼びます)。 これには、Windows フォーム、コンソール アプリケーションなどのように Office アプリケーションを自動化するアプリケーション、および別のプロセスで読み込まれているアドインが該当します。

他のソリューションへのオブジェクトの公開

アドイン内のオブジェクトを他のソリューションに公開するには、アドイン内で次の手順を実行します。

  1. 他のソリューションに公開するクラスを定義します。

  2. ThisAddIn クラスの RequestComAddInAutomationService メソッドをオーバーライドします。 他のソリューションに公開するクラスのインスタンスを返します。

他のソリューションに公開するクラスの定義

公開するクラスは、少なくともパブリックであり、ComVisibleAttribute 属性が true に設定されていて、IDispatch インターフェイスを公開する必要があります。

IDispatch インターフェイスを公開するには、次の手順を実行することを推奨します。

  1. 他のソリューションに公開するメンバーを宣言するインターフェイスを定義します。 このインターフェイスは、アドイン プロジェクトで定義できます。 ただし、VBA 以外のソリューションにクラスを公開する場合は、別のクラス ライブラリ プロジェクトでこのインターフェイスを定義する必要があります。そうすることで、アドインを呼び出すソリューションは、アドイン プロジェクトを参照せずに、インターフェイスを参照できます。

  2. このインターフェイスに ComVisibleAttribute 属性を適用し、この属性を true に設定します。

  3. このインターフェイスを実装するようにクラスを変更します。

  4. クラスに ClassInterfaceAttribute 属性を適用し、この属性の値を ClassInterfaceType 列挙型の None 値に設定します。

  5. アウトプロセス クライアントにクラスを公開する場合は、以下の操作も実行する必要があります。

    • StandardOleMarshalObject からクラスを派生させる。 詳細については、「アウトプロセス クライアントへのクラスの公開」を参照してください。

    • インターフェイスを定義するプロジェクトの [COM 相互運用機能の登録] プロパティを設定する。 この操作は、クライアントが事前バインディングを使用してアドインを呼び出すことができるようにする場合にのみ必要です。 詳細については、「方法 : コンポーネントを 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 を自動化するソリューションで使用できます。

他のソリューションからのオブジェクトへのアクセス

アドインで公開されたオブジェクトを呼び出すには、クライアント ソリューションで次の手順を実行します。

  1. 公開されたアドインを表す COMAddIn オブジェクトを取得します。 クライアントは、ホスト Office アプリケーションのオブジェクト モデルの Application.COMAddIns プロパティを使用して、利用可能なすべてのアドインにアクセスできます。

  2. COMAddIn オブジェクトの Object プロパティにアクセスします。 このプロパティは、アドインから公開されたオブジェクトを返します。

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

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 プロジェクトを作成する

概念

アプリケーション レベルのアドインのプログラミング

Office ソリューションの開発

機能拡張インターフェイスによる UI 機能のカスタマイズ

アプリケーション レベルのアドインのアーキテクチャ

履歴の変更

日付

履歴

理由

2010 年 9 月

内容の構成を改善し、重複する情報を削除しました。

情報の拡充