アドインのパワー

With Visual Studio Tools For Applications によってアプリケーションのユーザーによるカスタマイズを可能にする

Paul Stubbs

この記事は、2007 Microsoft Office system のプレリリース版に基づいています。ここに記載される情報は、いずれも変更される可能性があります。

この記事で取り上げる話題:

  • System.AddIn 名前空間
  • アドインの基礎と ShapeApp サンプル
  • InfoPath 2007 のアドインの作成
  • Visual Studio Tools for Applications の入手方法
この記事で使用する技術:
Visual Studio 2005、InfoPath 2007、C#、Visual Basic

目次

アドインの概要
ShapeApp の使用
アドインの活用 : InfoPath 2007
Visual Studio Tools for Applications の入手方法


多くのソフトウェア開発者が、アプリケーションをカスタマイズ可能にすることにより、その有用性を向上させてきました。これは、通常、Microsoft Visual Basic for Applications (VBA) などのテクノロジの追加によって実現されます。しかし、最近は、VBA では十分でない状況もあります。より高いセキュリティ、より便利な開発ツール、64 ビット サポート、および全般的により堅牢なソリューションを顧客に提供する手段が必要です。また、ソリューションは、ユーザーのマクロが企業に欠かせないツールとなったときに、本来の開発者に簡単に引き継ぐことができる必要もあります。

現在、マイクロソフトから入手できるアプリケーション カスタマイズのテクノロジは、3 つあります。Visual Studio Tools for Applications、Visual Studio Tools for Office、および VBA です。開発者からは、似て非なるこれらのテクノロジが、それぞれどのような要件に対応できるのかという質問がよく寄せられます。VBA は、最も以前から存在し、最もよく使用されているテクノロジです。Visual Studio Tools for Applications は、.NET Framework における VBA の代替と考えることができます。Visual Studio Tools for Applications、および VBA は、同じアプリケーション内で並列実行できます。このため、VBA を使用するアプリケーションに、Visual Studio Tools for Applications サポートを追加することが可能であり、これにより、ユーザーは、Visual Basic、あるいは Visual C# を使用できるようになります。

Visual Studio Tools for Applications を作成したチームが、Visual Studio Tools for Office も開発しており、この 2 つのテクノロジには、共通のアーキテクチャがあります。しかし、Visual Studio Tools for Office は、カスタム ソリューションに Microsoft Office を組み込む開発者を対象としています。一方、Visual Studio Tools for Applications は、これを含むアプリケーションのエンド ユーザーを対象としています。たとえば、会計士が、企業の開発者部門に依頼することなく、関数を作成して、会計ソフトウェアに新しい機能を追加することができます。エンド ユーザーは、アドインを作成することにより新しい機能を追加します。

Visual Studio 2005 Tools for Applications は、簡略化された Visual Studio 2005 開発環境でエンド ユーザーが開発できる、.NET Framework ベースのコードによるアプリケーション カスタマイズを提供することにより、開発者の要求に応えることを目的としています。

どのアプリケーションにおいても、要求される機能は、通常、使用可能な開発資源を超えてしまいます。それでは、この制約の中で、顧客の満足度を上げるにはどのようにすればよいでしょうか。Visual Studio Tools for Applications があれば、アプリケーションのユーザーが、特殊な要件を満たすアドインを作成できます。Visual Studio Tools for Applications を統合することにより、一部の限られた顧客を対象とした機能を開発する時間を節約できます。また、アプリケーションのユーザーに、開発者としての力を与えることが簡単になり、新しい開発者にアプリケーションを教える手間も省くことができます。

Visual Studio Tools for Applications の使用には、実際には、2 つの段階があります。まずは、アプリケーションにこれを統合する必要があります。これは、アプリケーションのソリューションを開発するユーザー向けのエクスペリエンスを決定することを意味します。次に、開発者となるエンド ユーザー (アプリケーションを使用し、カスタマイズする人) がそれを使用します。ユーザーへの開発エクスペリエンスは、統合フェーズにおいて決定した判断を基に設計します。ここでは解説のために、Visual Studio Tools for Applications を InfoPath に統合するときに、Microsoft Office InfoPath 2007 の開発者によって行われた選択をサンプルとして紹介します。

アドインの概要

前に説明したように、新しい機能の媒体はアドインです。アドインという用語は、コンテキストによって意味が異なります。Visual Studio Tools for Applications では、"アドイン"、あるいは"カスタマイズ"という用語を、アプリケーションによって動的に読み込まれるすべてのコンポーネントを表す用語として使用します。アドインを読み込むアプリケーションが、ホスト アプリケーションです。アプリケーション レベルのアドインは、COM アドインの形式で、Office ユーザーによく使用されています。

アドインには、常に存続期間が決められています。たとえばアドインは、アプリケーション レベルの存続期間とすることができます。この場合、アドインは、アプリケーションが開始するときに読み込まれ、アプリケーションが終了するときにアンロードされます。アドインの存続期間は、これより短い場合もあります。たとえば、Visual Studio Tools for Office ベースの Word、および Excel ソリューションの場合には、ドキュメントに連動した存続期間となります。アドインは、ホスト アプリケーションのオブジェクト モデルのある部分のみに適用するように、その適用範囲を制限することもできます。たとえば、Word のようなアプリケーションの場合、アプリケーションレベル アドインは、Application オブジェクトを適用範囲とし、ドキュメントレベル アドインは、Document オブジェクトを適用範囲とします。この適用範囲は、単純に、Visual Basic の "Me" キーワード、あるいは C# の "this" キーワードを参照したときに戻されるオブジェクトと考えることができます。ここで挙げた 2 つは、存続期間、および適用範囲の単なる例に過ぎません。

ホスト アプリケーションは、どのような存続期間、あるいは適用範囲のアドインも自由に組み込むことができます。たとえば、フォーム、あるいはダイアログ ボックスを適用範囲とするアドインも実装できます。Visual Studio Tools for Applications には、ホスト アプリケーションに関する制限がなく、さまざまなシナリオを柔軟に処理できます。

Visual Studio Tools for Applications では、ホスト アプリケーションが、アドインを動的に読み込み、およびアンロードするためのクラスが提供されています。既定の動作では、各アドインが、それぞれ独自のアプリケーション ドメインに読み込まれます。これにより、ホストとアドイン、および他のアドインとの間で独立性が確保されます。アプリケーション ドメインの分離は、アドインが、ホスト アプリケーションに干渉することを防ぎ、アドインを、メモリからアンロードできるようにします。アドイン読み込みモデルは、この他にもあり、さまざまなレベルの独立性が可能です。複数のアドインを同じアプリケーション ドメインに読み込んだり、ホストのアプリケーション ドメインに読み込んだりすることができます。アドインは、ホストのアプリケーション プロセス外のプロセスで、アプリケーション ドメインに読み込むこともできます。これは、最大の独立性を確保します。

64 ビット プロセッサに移行するアプリケーションが増え、64 ビット アドインを読み込む機能の重要性も徐々に高まってきています。Visual Studio Tools for Application は、32 ビット、64 ビット、あるいはビット数に依存しないアドインの作成、および読み込みをサポートします。ビット数に依存しないアドインが既定の動作であり、この場合のアドインは、32 ビット、あるいは 64 ビットのどちらのプロセスでも実行できるようになります。

アドイン ローダーは、System.AddIn 名前空間で定義され、System.AddIn.dll アセンブリに含まれます。この名前空間は、まず、Visual Studio Tools for Applications に付属して出荷され、その後、WinFX の一部となる予定です。WinFX の一部として出荷されるコンポーネントは、Managed Add-In Framework (MAF) と総称されます。MAF では、ホスト アプリケーションのバージョンから独立した、新しいバージョンのアドインを作成することが可能です。また、MAF は、アドインの動的な読み込み、およびアンロードが安全な方法で行われるようにします。MAF は、バージョン非依存を可能にする不変部分としてコントラクトを使用します。コントラクトは、System.AddIn.Contract 名前空間で定義され、System.AddIn.Contract.dll に含まれます。

コントラクトによって、プロキシ、およびアダプタは、アプリケーション ドメインを越えて通信することができます。プロキシ、およびアダプタは、アドインと、ホスト アプリケーションとの通信を可能にする部分です (図 1 を参照)。Visual Studio Tools for Applications には、Proxygen.exe というコマンドライン ツールが含まれます。これは、入力としてアプリケーションのオブジェクト モデルを受け取り、C# ソース コード ファイルとしてプロキシを作成します。作成後、プロキシは、必要に応じて変更することができます。Proxygen.exe は、また、オブジェクト モデルを表す、XML ベースの記述子ファイルを生成することもできます。プロキシ記述子ファイルは、Proxygen.exe への単独の入力とすることができ、この場合、入力の記述子ファイル、あるいは生成された C# ファイル、あるいはその両方を操作することにより、必要なプロキシを取得できます。

図 1 アドインとホスト アプリケーションの通信

アダプタは、プロキシが呼び出す System.AddIn.Contract インターフェイスを実装します。プロキシ、およびアダプタは、コントラクトの使用に関する実装、および複雑さを、ホスト アプリケーション、およびアドインから隠します。プロキシは、ホスト アプリケーションのオブジェクト モデルのわかりやすいビューを提供し、さらに、キャッシュのような技法を実装することで、境界を越えての呼び出しを最適化するために適した場所も提供します。各部分は、別個のアセンブリにパッケージされます。プロキシは、Visual Studio Tools for Applications を使用して作成される、アドイン アセンブリの基本クラスとして使用されます。

Visual Studio Tools for Applications に含まれる機能は、通常、Visual Studio 2005 開発環境に含まれる機能の一部ですが、外観、および動作は、使い慣れた Visual Studio IDE とあまり変わりません (図 2 を参照)。Visual Studio Tools for Applications 環境をアプリケーションに埋め込むことで、独自のシームレスなアドイン開発環境をユーザーに提供することができます。

図 2 Visual Studio Tools for Applications でのマクロのコーディング

Visual Studio Tools for Applications 環境は、VBA と同様に、Alt+F11 などのキーの組み合わせを使用してホスト アプリケーション内で起動できます。しかし、Visual Studio Tools for Applications は、VBA とは異なり、[スタート] メニューからも起動できるため、Visual Studio により近い開発モデルをユーザーに提供できます。統合のレベルは、アプリケーション、およびエンド ユーザーに合わせて選択できます。

Visual Studio と共通のアーキテクチャを持つことの利点として、Visual Studio Tools for Applications プロジェクトは、Visual Studio の別のバージョンでも開くことができます。これは、企業で VBA を使用したときによく発生する問題を解消します。たとえば、あるユーザーが、個人で使用するために、あるいは限られた作業グループで使用するために、VBA ベースのソリューションを作成したとします。そのソリューションがすばらしければ、より広く配布することを考えます。しかし、スケーラビリティがなく、企業のセキュリティ、あるいは他の標準に準拠することが不可能な場合があります。また、企業全体のソリューションを担当するチームは、VBA に精通していない場合があり、その場合も、面倒な事態となることがあります。このような状況で一般に行われる対応は、カスタマイズの完全な再作成です。

こうした問題は、ホスト アプリケーションで Visual Studio Tools for Applications プロジェクトを採用すれば解消されます。Visual Studio Tools for Application プロジェクトは、真の Visual Studio プロジェクトです。開発者は、Visual Studio Tools for Applications プロジェクトを、Visual Studio の完全バージョンを使用して開き、単体テスト、パフォーマンス テストなどのエンタープライズ機能を追加することができます。

ShapeApp の使用

ShapeApp は、Visual Studio Tools for Applications SDK に含まれるサンプル アプリケーションです。この描画プログラムでは、描画画面に図形をドラッグすることが可能です (図 3 を参照)。

図 3 ShapeApp サンプル アプリケーション

図 3 ShapeApp サンプル アプリケーション

ShapeApp には、C++ で記述されたバージョンと、C# で記述されたバージョンの 2 つがあり、各バージョンに、3 つのサンプルが用意されています。ShapeAppCSharp.zip、および ShapeAppMFC.zip には、Visual Studio Tools for Applications による変更が加えられていない、ShapeApp アプリケーションのソース コード プロジェクトが含まれています。ドキュメントのウォークスルーでは、このプロジェクトを、Visual Studio Tools for Applications を統合する開始点として使用します。

ShapeAppBasicCSharp.zip、および ShapeAppBasicMFC.zip には、Visual Studio Tools for Applications の基本的実装を含む、ShapeApp のソース コード プロジェクトが含まれています。これは、ウォークスルーの最終結果です。ウォークスルーを省略して、稼動するサンプルを確認したい場合には、このサンプルを使用します。基本的な実装では、アプリケーション レベル アドインの作成が中心となっています。ウォークスルーでは、アドイン マネージャを使用してアドインを読み込む方法とアンロードする方法、およびオブジェクト モデルの MAF 対応プロキシを作成する方法が説明されています。

このサンプルでは、アドイン用の Visual Studio Tools for Applications プロジェクト テンプレートを作成するステップも説明されています。これらのテンプレートは、通常の Visual Studio プロジェクト テンプレートです。これらは、Visual Studio の [新しいプロジェクト] ダイアログ ボックスに表示されます。プロジェクト テンプレートは、プロジェクト インスタンスを作成するために使用されます。

ShapeAppAdvancedCSharp.zip、および ShapeAppAdvancedMFC.zip には、Visual Studio Tools for Applications の高度な機能がいくつか統合された、ShapeApp アプリケーションのソース コード プロジェクトが含まれています。

アドインの活用 : InfoPath 2007

Visual Studio Tools for Applications 統合の例は、InfoPath 2007 からも試すことができます。ここでは、アドインを作成するプロセスを説明するので、Office による設計のエクスペリエンスを試すことができます。しかし、これが設計できる唯一のユーザー エクスペリエンスではないことに注意してください。この後の処理を行うには、InfoPath 2007 が必要です。

InfoPath では、構造化されたデータ フォームをデザインしたり、フォームに入力したりすることができます。多くの Office アプリケーションと異なり、InfoPath は、VBA をサポートしていません。代わりに、JScript、および VBScript を既定でサポートしており、Microsoft Script Editor を使用します。InfoPath 2003 Service Pack 1 (SP1) で始める場合には、InfoPath 2003 Toolkit for Visual Studio .NET 2003 をダウンロードすることができます。これにより、Visual Basic、あるいは C# でソリューションを作成することが可能になります。このツールキットは、Visual Studio 2005 向けに更新されており、Visual Studio 2005 Tools for Office に含まれています。InfoPath 2007 には、Visual Studio Tools for Applications が含まれるため、埋め込まれている Visual Studio Tools for Applications 環境を使用して、Visual Basic、あるいは C# でアプリケーションを作成できます。図 4 は、デザイン モードで、Alt+Shift+F12 キーを押して表示された、開発環境、およびコードを示しています。

図 4 InfoPath 2007 での Visual Studio Tools for Applications の使用

単純な InfoPath フォームを作成し、Visual Studio Tools for Applications を使用して、それをカスタマイズしてみましょう。InfoPath には、多くのサンプル フォームが含まれているので、ここではその 1 つを使用します。[ファイル] メニューの [フォームの入力] を選択し、[サンプルのカスタマイズ] を選択します。[SampleForm] を選択し、次に [議題と議事録] フォームを選択します。右側のタスクから [このフォームのデザイン] をクリックします。これで、サンプル フォームがデザイン モードで表示されます。

Shift+Alt+F12 キーを押すか、あるいは [ツール]、[プログラミング]、[Microsoft Visual Studio Tools for Applications] をクリックして、開発環境を開きます。最初に、フォームを保存するように求められます。[OK] をクリックし、フォームを保存する名前、および場所を指定します。これで、開発環境が、既定の言語である Visual Basic で開かれます。InfoPath での既定の言語は、C#、あるいは Visual Basic に切り替えられます。切り替えるには、[ツール]、[オプション]、[デザイン] を選択します。

この時点で、図 4 に示すように、InfoPath によっていくつかのコードが生成されていることがわかります。InfoPath オブジェクト モデル、および .NET Framework の XML クラスを参照するための Import ステートメントが追加されています。名前空間は、フォームの名前と一致し、FormCode と呼ばれるクラスに、InternalStartup メソッドが含まれます。InternalStartup は、InfoPath がイベント ハンドラを追加する場所です。F5 キーを押すか、あるいは [デバッグ]、[デバッグ開始] をクリックすると、コードがコンパイルされ、プレビュー モードで InfoPath フォームのデバッグが開始されます。これで、プレビューのフォームが開かれますが、まだコードを記述していないため、何も行われません。

では、フォームにコードを追加してみましょう。フォーカスを Visual Studio Tools for Applications に戻し、Ctrl+Alt+Break キーを押すか、あるいは [デバッグ]、[デバッグの停止] をクリックします。デバッガが停止すると、フォームのプレビュー モードは閉じられます。最初に行う処理は、フォームを読み込んだときに簡単なメッセージ ボックスが表示されるようにすることです (図 5 を参照)。フォームのデザイン ビューから [ツール]、[プログラミング]、[Loading イベント] をクリックすると、InfoPath が、フォームの読み込みイベントを作成します。FormEvents_Loading メソッドに、メッセージ ボックスを表示するコードを追加します。このメソッドは、フォームが開かれたときに呼び出されます。

ここで、F5 キーを押してフォームを実行します。プレビューのフォームが読み込まれる前に、メッセージ ボックスが表示されます。[OK] をクリックしてメッセージ ボックスを閉じると、フォームの読み込みが完了します。これで、コードは完成であり、フォームに付加されました。Visual Studio Tools for Applications を閉じても、コードは、プレビュー モードに切り替えたときに実行されます。

これで、とても簡単に始められることが理解できたことでしょう。次に、このシナリオにもう少し複雑なコードを追加します。サンプル フォームには、開催者用のフィールドがあります。Loading イベントで、プロジェクト名、マネージャ名、および部署名などが設定されるようにしてみたいと思います。図 6 に示すように、SetFieldValue というヘルパ関数を作成することで、複数のフィールドに値を簡単に設定できます。SetFieldValue は、Loading イベントで、新しい値、およびフィールドへの XPath を渡して呼び出すことができます。XPath は、どのようにして知ることができるでしょうか。XPath 値を確認するには、InfoPath のデザイン ビューでフィールドを選択し、[データ ソース] タスク ペインを表示します。[データ ソース] タスク ペインには、データ フィールドのツリー ビューが表示されます。確認したいフィールドを右クリックし、コンテキスト メニューから [XPath のコピー] を選択します。この XPath 式を、コードの、フィールドを参照する必要のある部分に貼り付けます。

これは、開発エクスペリエンスの設計の 1 つに過ぎません。ユーザーを支援するために、基本的な機能を提供したり、マクロの記録のように高度な機能を追加したりすることができます。Visual Studio Tools for Applications は、あくまでツールであり、何を作成するかは開発者に任されます。

Visual Studio Tools for Applications の入手方法

Visual Studio Tools for Applications は、Visual Studio 2005 SDK に含まれます。これは、MSDN 機能拡張 Web サイト から、VSIP Affiliate メンバとして登録することにより無償でダウンロードできます。SDK には、Visual Studio Tools for Applications セットアップ パッケージが含まれています。パッケージを実行することにより、Visual Studio Tools for Applications 開発環境、およびランタイムがインストールされます。SDK には、ヘルプ ドキュメント、およびサンプル アプリケーションも含まれています。ヘルプ ファイルには、Visual Studio Tools for Applications を、独自に作成したアプリケーションに統合するプロセスが説明されています。この統合プロセスを支援するツールも含まれています。Proxygen.exe は、オブジェクト モデルから MAF プロキシを作成します。また、Projectgen.exe は、アドインを作成するための Visual Studio Tools for Applications プロジェクト テンプレートを生成します。

Visual Studio SDK には、Visual Studio のカスタマイズに関するヘルプ、およびサンプルが含まれています。これらのトピックの多くは、Visual Studio Tools for Applications にも直接的に関連があります。たとえば、カスタム ヘルプ、プロジェクト テンプレート、プロジェクト ウィザード、およびプロファイルの作成に関する情報が含まれていますが、エンド ユーザーを対象としてシームレスな開発エクスペリエンスを作成するためには、これらがすべて必要となります。

Visual Studio Tools for Applications は、強力で、柔軟なカスタマイズ エクスペリエンスをエンド ユーザーに提供することにより、開発者が作成したアプリケーションにおいて、必要な機能をエンド ユーザー自身が実現することを支援します。Visual Studio Tools for Applications 開発環境、および .NET Framework は、エンド ユーザーにとって、アプリケーションの安全性が保たれる環境で高速に開発を行うためのツールとなります。結果として、アプリケーションは、企業全体での使用のためにいつでも拡張できる手法で、個々のユーザーに合わせて調整されることになります。計画がまだ決定していない新機能を、アプリケーションに追加し、実現するようなことも避けられます。


Paul Stubbs は、マイクロソフトの Visual Studio Tools for Applications チームのプログラム マネージャです。また、Office ソリューションを開発する Visual Studio Tools for Office チームとも協力しています。彼は、Tech・Ed、および TechReady で公演した経験があり、マイクロソフト フォーラムの開発者コミュニティにも参加しています。Paul のブログは、blogs.msdn.com/pstubbs で読むことができます。


 この記事は、 MSDN マガジン - 2006 年 8 月号からの翻訳です。 .