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

文書翻訳 文書翻訳
文書番号: 302901 - 対象製品
この記事は、以前は次の ID で公開されていました: JP302901
すべて展開する | すべて折りたたむ

目次

概要

Microsoft Office XP および Microsoft Office 2003 では、Office アプリケーションを拡張したり制御したりするアプリケーション アドインを作成するための、統一された新しいデザイン アーキテクチャがサポートされています。このようなアドインは COM アドインと呼ばれます。この資料では、Office COM アドインの概要と、Microsoft Visual C# .NET を使用して Office COM アドインを作成する方法について説明します。

IDTExensibility2 インターフェイス

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

OnConnection

OnConnection イベントは、COM アドインの接続時に発生します。アドインの接続は、起動時に行われるか、エンド ユーザーによって行われるか、またはオートメーションを介して行われます。OnConnection が正常に実行された場合、アドインは読み込まれたと見なされます。エラー メッセージが返された場合、ホスト アプリケーションはすぐにアドインへの参照を解放し、オブジェクトは破棄されます。

OnConnection は、次の 4 つのパラメータを取ります。
  • Application - ホスト アプリケーション オブジェクトへの参照。
  • ConnectMode - アドインの接続方法を示す定数。アドインの接続方法は次のいずれかです。
    • ext_cm_AfterStartup - エンド ユーザーによって [COM アドイン] ダイアログ ボックスからアドインが起動された。
    • ext_cm_CommandLine - コマンド ラインからアドインが接続された。これは Office アプリケーションの COM アドインの作成では使用しません。
    • ext_cm_External - 外部アプリケーションによってオートメーションを使用してアドインが接続された。これは Office アプリケーションの COM アドインの作成では使用しません。
    • ext_cm_Startup - アドインは、アプリケーションの起動時にホストによって読み込まれた。この動作はレジストリの設定によって制御されます。
  • AddInInst - ホスト アプリケーションの COMAddIns コレクション内の、このアドインを参照する COMAddIn オブジェクトへの参照。
  • Custom - ユーザー定義のデータを保持する Variant 型の配列。

OnDisconnection

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

OnDisconnection は、次の 2 つのパラメータを取ります。
  • RemoveMode - アドインの切断方法を示す定数。アドインの切断方法は次のいずれかです。
    • ext_dm_HostShutdown - ホスト アプリケーションの終了時にアドインが切断された。
    • ext_dm_UserClosed - エンド ユーザーまたはオートメーション コントローラによってアドインが切断された。
  • Custom - ユーザー定義のデータを保持する 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 = Disconnect - ロードしない。
  • 1 = Connected - ロードする。
  • 2 = Bootload - アプリケーションの起動時にロードする。
  • 8 = DemandLoad - ユーザーの要求があったときにだけロードする。
  • 16 = ConnectFirstTime - 1 回だけ (次回の起動時に) ロードする。
通常は 0x03 (Connected | Bootload) を指定します。

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

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

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

Visual C# .NET で COM アドインを作成するには、次の手順を実行します。
  1. Visual C# .NET でクラス ライブラリ プロジェクトを作成します。
  2. IDTExtensibility2 が実装されているタイプ ライブラリへの参照を追加します。このタイプ ライブラリには、Extensibility という名前でプライマリ相互運用機能アセンブリが用意されています。
  3. Microsoft Office オブジェクト ライブラリへの参照を追加します。このタイプ ライブラリには、Office という名前でプライマリ相互運用機能アセンブリが用意されています。
  4. クラス ライブラリに、IDTExtensibility2 を実装するパブリック クラスを作成します。
  5. クラス ライブラリをビルドした後、ライブラリを COM の相互運用機能に登録します。これを行うには、このクラス ライブラリに対応する、厳密な名前を付けたアセンブリを生成し、それを COM の相互運用機能に登録します。Regasm.exe を使用して、.NET コンポーネントを COM の相互運用機能に登録できます。
  6. Office アプリケーションでアドインが認識されてロードされるように、レジストリ エントリを作成します。
これらの手順をすべて手動で完了することもできますが、共有アドインという種類の .NET プロジェクトを作成する方法もあります。共有アドイン プロジェクトを作成すると、.NET での COM アドインの作成を支援する機能拡張ウィザードが起動します。

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

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

手順例

  1. 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. [プロジェクト] メニューの [参照の追加] をクリックします。[.NET] タブでコンポーネントの一覧の [System.Windows.Forms.DLL] をクリックし、[選択] をクリックし、[OK] をクリックします。
  6. Connect クラスで使用する名前空間の一覧に次の行を追加します。
    using System.Reflection;
  7. Connect クラスに次のメンバを追加します。
    private CommandBarButton MyButton; 
  8. 次のように、IDTExtensibility2 の各メンバに対応するコードを Connect クラスに実装します。
    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 アドインをビルドすると、COM の相互運用機能に .NET クラスが登録されます。
    2. アドインのホスト アプリケーションとして選択した Office アプリケーションのいずれか (たとえば Word または Excel) を起動します。
    3. アドインが起動すると、アドインの OnStartupComplete イベントが呼び出され、メッセージ ボックスが表示されます。メッセージ ボックスを閉じます。アドインにより、標準のツール バーに "My Custom Button" というキャプションのカスタム ボタンが追加されます。
    4. [My Custom Button] をクリックします。アドインでボタンの Click イベントが処理され、メッセージ ボックスが表示されます。メッセージ ボックスを閉じます。
    5. Office アプリケーションを終了します。
    6. アプリケーションの終了時に OnBeginShutDown イベントが発生し、メッセージ ボックスが表示されます。メッセージ ボックスを閉じてデモを終了します。

関連情報

COM アドイン作成の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
190253 [INFO] VB5 で VB6 デザイナが機能しない

プロパティ

文書番号: 302901 - 最終更新日: 2007年4月23日 - リビジョン: 8.1
この資料は以下の製品について記述したものです。
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Office Outlook 2003
  • Microsoft Outlook 2002 Standard Edition
  • Microsoft Office PowerPoint 2003
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Office Word 2003
  • Microsoft Word 2002
キーワード:?
kbautomation kbhowtomaster KB302901
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com