Visual C# .NET を使用して Office COM アドインをビルドする方法

概要

Microsoft Office XP、Microsoft Office 2003、および Microsoft Office 2007 では、Office アプリケーションを強化および制御するためのアプリケーション アドインを構築するための統一設計アーキテクチャがサポートされています。 これらのアドインは、Microsoft Component Object Model (COM) アドインと呼ばれます。この記事では、Office COM アドインについて説明し、Microsoft Visual C# .NET を使用して Office COM アドインをビルドする方法について説明します。

IDTExensibility2 インターフェイス

COM アドインは、Microsoft アドイン デザイナー タイプ ライブラリ (Msaddndr.dll) で説明されているように、IDTExensibility2 インターフェイスを実装するインプロセス COM サーバーまたは ActiveX ダイナミック リンク ライブラリ (DLL) です。 すべての COM アドインはこのインターフェイスから継承され、5 つのメソッドのそれぞれを実装する必要があります。

Onconnection

OnConnection イベントは、COM アドインが接続されるたびに発生します。 アドインは、起動時、エンド ユーザー、または Automation 経由で接続できます。 OnConnection イベントが正常に返された場合、アドインは読み込まれると言われます。 エラー メッセージが返されると、ホスト アプリケーションはアドインへの参照を直ちに解放し、オブジェクトが破棄されます。

OnConnection イベントは、次の 4 つのパラメーターを受け取ります。

  • アプリケーション: ホスト アプリケーション オブジェクトへの参照。

  • ConnectMode: アドインの接続方法を指定する定数。 アドインは、次の方法で接続できます。

    • ext_cm_AfterStartup: アドインは、エンド ユーザーが [COM アドイン] ダイアログ ボックスから開始します。
    • ext_cm_CommandLine: アドインはコマンド ラインから接続されます。 これは、Office アプリケーション用の COM アドインのビルドには適用されないことに注意してください。
    • ext_cm_External: アドインは、Automation を介して外部アプリケーションによって接続されます。 これは、Office アプリケーション用の COM アドインのビルドには適用されないことに注意してください。
    • ext_cm_Startup: アドインは、アプリケーションの起動時にホストによって開始されます。 この動作は、レジストリの設定によって制御されます。
  • AddInInst: ホスト アプリケーションの COMAddIns コレクション内のこのアドインを参照する COMAddIn オブジェクトへの参照。

  • カスタム: ユーザー定義データを保持できる Variant 型の値の配列。

OnDisconnection

OnDisconnection イベントは、COM アドインが切断され、メモリからアンロードされる直前に発生します。 アドインは、このイベントでリソースのクリーンアップを実行し、ホスト アプリケーションに加えられた変更を復元する必要があります。

OnDisconnection イベントは、次の 2 つのパラメーターを受け取ります。

  • RemoveMode: アドインの切断方法を指定する定数。 アドインは、次の方法で切断できます。

    • ext_dm_HostShutdown: ホスト アプリケーションが閉じると、アドインは切断されます。
    • ext_dm_UserClosed: アドインは、エンド ユーザーまたは Automation コントローラーによって切断されます。
  • カスタム: ユーザー定義データを保持できる Variant 型の値の配列。

OnAddInsUpdate

OnAddInsUpdate イベントは、登録済みの COM アドインのセットが変更されたときに発生します。 つまり、COM アドインがインストールまたはホスト アプリケーションから削除されるたびに、このイベントが発生します。

OnStartupComplete と OnBeginShutdown

OnStartupComplete メソッドと OnBeginShutdown メソッドは、ホスト アプリケーションが残っているか、アプリケーションがメモリからの読み込みまたはアンロードでビジー状態であるため、ユーザーの操作を回避する必要がある状態に入ったときに呼び出されます。 OnStartupComplete メソッドは、アドインが起動時に接続され、ホストがシャットダウン中にアドインを切断した場合にのみ OnBeginShutdown メソッドが呼び出される場合にのみ呼び出されます。

ホスト アプリケーションのユーザー インターフェイスは、これらのイベントが発生したときに完全にアクティブであるため、OnConnection イベントと OnDisconnection イベントから使用できない特定のアクションを実行する唯一の方法である可能性があります。

COM アドインの登録

COM アドインは、通常の COM 登録に加えて、それが実行されている各 Office アプリケーションに登録する必要があります。 特定のアプリケーションに登録するには、アドインは、次の場所で、その ProgID をキーの名前として使用してサブキーを作成する必要があります。

HKEY_CURRENT_USER\Software\Microsoft\Office\OfficeApp\Addins\ProgID

アドインでは、表示名と完全な説明の両方について、このキーの場所に値を指定できます。 さらに、アドインでは、LoadBehavior という名前の DWORD 値を使用して、目的の読み込み動作を指定する必要があります。 この値は、アドインがホスト アプリケーションによって読み込まれる方法を決定し、次の値の組み合わせで構成されます。

  • 0 = 切断 - 読み込まれません。
  • 1 = 接続済み - 読み込まれます。
  • 2 = Bootload - アプリケーションの起動時に読み込みます。
  • 8 = DemandLoad - ユーザーが要求した場合にのみ読み込みます。
  • 16 = ConnectFirstTime - 1 回だけ読み込みます (次回の起動時)。

指定された一般的な値は0x03 (接続済み|Bootload)。

IDTExtensibility2 を実装するアドインでは、ユーザー インターフェイスをサポートしない操作に対してアドインが安全かどうかを示すために 、CommandLineSafe という DWORD 値も指定する必要があります。 0x00の値は False を示し、0x01の値は True を示します。

Visual C# .NET を使用して COM アドインをビルドする方法

前述のように、Office COM アドインは、COM ランタイム レイヤーを介して Office アプリケーションによってアクティブ化されるインプロセス COM サーバーです。 そのため、.NET で COM アドインを開発するには、アドイン コンポーネントを .NET に実装し、COM 相互運用レイヤーを介して COM クライアント (つまり Office アプリケーション) に公開する必要があります。

Visual C# .NET で COM アドインを作成するには、次の手順に従います。

  1. Visual C# .NET で、クラス ライブラリ プロジェクトを作成します。
  2. IDTExtensibility2 を実装するタイプ ライブラリへの参照を追加します。 このプライマリ相互運用機能アセンブリは、拡張機能という名前で既に使用できます。
  3. Microsoft Office オブジェクト ライブラリへの参照を追加します。 このプライマリ相互運用機能アセンブリは、Office という名前で既に使用できます。
  4. IDTExtensibility2 を実装するパブリック クラスをクラス ライブラリに作成します。
  5. クラス ライブラリがビルドされたら、COM 相互運用機能のライブラリを登録します。 これを行うには、このクラス ライブラリの厳密な名前付きアセンブリを生成し、COM 相互運用機能に登録します。 Regasm.exeを使用して、COM 相互運用機能の .NET コンポーネントを登録できます。
  6. Office アプリケーションがアドインを認識して読み込むことができるように、レジストリ エントリを作成します。

これらの手順をすべて完了することも、Shared Addin 型の .NET プロジェクトを作成することもできます。 これにより、.NET で COM アドインを作成するのに役立つ機能拡張ウィザードが開始されます。

拡張機能ウィザードは、IDTExtensibility2 インターフェイスを実装する Connect クラスと共に Visual C# .NET クラス ライブラリ プロジェクトを作成します。 IDTExtensibility の空のメンバーを実装するスケルトン コードも生成されます。 このプロジェクトには、機能拡張アセンブリと Office アセンブリへの参照があります。 プロジェクトのビルド設定で、[COM 相互運用機能の登録] が選択されています。 アセンブリ キー (.snk) ファイルが生成され、Assemblyinfo.vb の AssemblyKeyfile 属性で参照されます。

このウィザードでは、クラス ライブラリ プロジェクトと共に、他のコンピューターに COM アドインを展開するために使用できるセットアップ プロジェクトが生成されます。 必要に応じて、このプロジェクトを削除できます。

ステップ バイ ステップの例

  1. Microsoft Visual Studio .NET の [ファイル] メニューの [新規] をクリックし、[プロジェクト] をクリックします。

  2. [新しいプロジェクト] ダイアログ ボックスで、[プロジェクトの種類] で [その他のプロジェクト] を展開し、[機能拡張プロジェクト] を選択して、[共有アドイン] テンプレートを選択します。

  3. アドインの名前として「MyCOMAddin」と入力し、[OK] をクリックします。

  4. 機能拡張ウィザードが表示されたら、次の手順に従います。

    1. 1 ページ目で、[Visual C# を使用してアドインを作成する] を選択し、[次へ] をクリックします。

    2. 2 ページで、次のホスト アプリケーションを選択し、[次へ] をクリックします。

      • Microsoft Word
      • Microsoft PowerPoint
      • Microsoft Outlook
      • Microsoft Excel
      • Microsoft Access
    3. 3 ページで、アドインの名前と説明を入力し、[次へ] をクリックします。

      メモ アドインの名前と説明は、Office アプリケーションの [COM アドイン] ダイアログ ボックスに表示されます。

    4. 4 ページ目で、使用可能なすべてのオプションを選択し、[次へ] をクリックします。

    5. [完了] をクリックします。

  5. [ プロジェクト] メニューの [ 参照の追加] をクリックします。 コンポーネントの一覧で [System.Windows.Forms.DLL] をクリックし、[選択] をクリックして、[OK] をクリックします。

  6. Connect クラスの名前空間の一覧に次を追加します。

    using System.Reflection;
    
  7. Connect クラスに次のメンバーを追加します。

    private CommandBarButton MyButton;
    
  8. 次のように、Connect クラスで IDTExtensibility2 のメンバーのコードを実装します。

    public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom) {
       applicationObject = application;
       addInInstance = addInInst;
    
    if(connectMode != Extensibility.ext_ConnectMode.ext_cm_Startup)
       {
          OnStartupComplete(ref custom);
       }
    
    }
    
    public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom) {
       if(disconnectMode != Extensibility.ext_DisconnectMode.ext_dm_HostShutdown)
       {
          OnBeginShutdown(ref custom);
       }
       applicationObject = null;
    }
    
    public void OnAddInsUpdate(ref System.Array custom)
    {
    }
    
    public void OnStartupComplete(ref System.Array custom)
    {
       CommandBars oCommandBars;
       CommandBar oStandardBar;
    
    try
       {
       oCommandBars = (CommandBars)applicationObject.GetType().InvokeMember("CommandBars", BindingFlags.GetProperty , null, applicationObject ,null);
       }
       catch(Exception)
       {
       // Outlook has the CommandBars collection on the Explorer object.
       object oActiveExplorer;
       oActiveExplorer= applicationObject.GetType().InvokeMember("ActiveExplorer",BindingFlags.GetProperty,null,applicationObject,null);
       oCommandBars= (CommandBars)oActiveExplorer.GetType().InvokeMember("CommandBars",BindingFlags.GetProperty,null,oActiveExplorer,null);
       }
    
    // Set up a custom button on the "Standard" commandbar.
       try
       {
       oStandardBar = oCommandBars["Standard"];        
       }
       catch(Exception)
       {
       // Access names its main toolbar Database.
       oStandardBar = oCommandBars["Database"];      
       }
    
    // In case the button was not deleted, use the exiting one.
       try
       {
       MyButton = (CommandBarButton)oStandardBar.Controls["My Custom Button"];
       }
       catch(Exception)
       {
          object omissing = System.Reflection.Missing.Value ;
          MyButton = (CommandBarButton) oStandardBar.Controls.Add(1, omissing , omissing , omissing , omissing);
          MyButton.Caption = "My Custom Button";
          MyButton.Style = MsoButtonStyle.msoButtonCaption;
       }
    
    // The following items are optional, but recommended. 
       //The Tag property lets you quickly find the control 
       //and helps MSO keep track of it when more than
       //one application window is visible. The property is required
       //by some Office applications and should be provided.
       MyButton.Tag = "My Custom Button";
    
    // The OnAction property is optional but recommended. 
       //It should be set to the ProgID of the add-in, so that if
       //the add-in is not loaded when a user presses the button,
       //MSO loads the add-in automatically and then raises
       //the Click event for the add-in to handle. 
       MyButton.OnAction = "!<MyCOMAddin.Connect>";
    
    MyButton.Visible = true;
       MyButton.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(this.MyButton_Click);
    
    object oName = applicationObject.GetType().InvokeMember("Name",BindingFlags.GetProperty,null,applicationObject,null);
    
    // Display a simple message to show which application you started in.
       System.Windows.Forms.MessageBox.Show("This Addin is loaded by " + oName.ToString()   , "MyCOMAddin");
       oStandardBar = null;
       oCommandBars = null;
    }
    
    public void OnBeginShutdown(ref System.Array custom)
    {
       object omissing = System.Reflection.Missing.Value ;
       System.Windows.Forms.MessageBox.Show("MyCOMAddin Add-in is unloading.");
       MyButton.Delete(omissing);
       MyButton = null;
    }
    
    private void MyButton_Click(CommandBarButton cmdBarbutton,ref bool cancel) {
       System.Windows.Forms.MessageBox.Show("MyButton was Clicked","MyCOMAddin"); }
    
  9. COM アドインをビルドしてテストします。 これを行うには、次の手順を実行します。

    1. [ ビルド] メニューで、[ ソリューションのビルド] をクリックします。 COM アドインをビルドすると、.NET クラスが COM 相互運用機能に登録されることに注意してください。
    2. アドインのホスト アプリケーションとして選択した Office アプリケーションの 1 つ (Microsoft Word や Microsoft Excel など) を起動します。
    3. アドインが開始されると、アドインの OnStartupComplete イベントが発生し、メッセージが表示されます。 メッセージ ボックスを閉じます。 アドインは、標準ツール バーに "My Custom Button" というキャプションを持つ新しいカスタム ボタンを追加しました。
    4. [マイ カスタム] ボタンをクリックします。 ボタンの Click イベントはアドインによって処理され、メッセージ ボックスが表示されます。 メッセージ ボックスを閉じます。
    5. Office アプリケーションを終了します。
    6. アプリケーションを終了すると、OnBeginShutDown イベントが発生し、メッセージが表示されます。 メッセージ ボックスを閉じ、デモンストレーションを終了します。