印刷用ページ       送信     
クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
テクニカルドキュメント
Office 開発
Visual Studio Tools for Office
 Visual Studio Tools for Office Appl...

  低帯域幅での表示をオンにする
Visual Studio Tools for Office Application Manifest Editor の使用

J. Jason De Lorme
Simplesheet, Inc.

February 2005
日本語版最終更新日 2005 年 4 月 15 日

適用対象 :
    Microsoft Visual Studio 2005
    Microsoft Visual Studio 2005 Tools for the Microsoft Office System (以前の Microsoft Visual Studio Tools for the Microsoft Office System, Version 2005)
    Microsoft Office Professional Edition 2003

概要 : アプリケーション マニフェストの概要と Application Manifest Editor ツールの開発プロセスについて説明します。その他、このツールでサポートされる一般的な配置シナリオについても説明します。

メモ   この記事はリリース前のドキュメントであり、将来のリリースで変更される可能性があります。Microsoft Visual Studio Tools for the Microsoft Office System, Version 2005 Beta 1 は Microsoft Visual Studio 2005 Beta 1 に含まれています。

ApplicationManifestEditor.msi のダウンロード

目次

Application Manifest Editor の紹介
Application Manifest Editor ツールのチュートリアル
Application Manifest Editor のデバッグ
キャッシュされているデータセットの調査
Application Manifest Editor によるドキュメントのグループの編集
アプリケーション マニフェストの検索と置換
アプリケーション マニフェストの項目の追加や削除
Application Manifest Editor で行われた編集作業の追跡
Application Manifest Editor の操作のログへの記録
Application Manifest Editor のコマンド ライン オプション
Application Manifest Editor のアーキテクチャ
Application Manifest Editor によるドキュメントのオープン
Application Manifest Editor のツリー ビューの使用
検討する必要があるコードのセキュリティの問題
まとめ
追加資料
執筆者紹介

Application Manifest Editor の紹介

Application Manifest Editor サンプル ツールでは、Microsoft Visual Studio Tools for the Microsoft Office System, Version 2005, Beta 1 (Visual Studio Tools for Office 2005) を使用して作成されたドキュメントに格納されているアプリケーション マニフェストやキャッシュされているデータセットの表示や変更を行うことができます。セットアップ プログラムを実行すると、Microsoft Visual C# を使って開発されたこのツールのソース コードがインストールされます。Visual Studio Tools for Office 2005 では、Microsoft Office Word 2003 や Microsoft Office Excel 2003 のソリューションを、完全な Microsoft .NET Framework を使用して C# や Microsoft Visual Basic .NET で開発できます。Visual Studio Tools for Office 2005 で開発したソリューションのコードは、中間言語 (IL) とメタデータを含むアセンブリへとコンパイルされ、開発に使用しているコンピュータに DLL として格納されます。アプリケーションの情報 (アプリケーション マニフェスト) は、Visual Studio Tools for Office ドキュメントにメタデータとして埋め込まれます。 ここには、Visual Studio Tools for Office ランタイムがアプリケーション ソリューションを見つけて実行するために使用する情報が含まれています。

アプリケーション マニフェストのフォーマットは拡張可能で、将来のバージョンではデザイン時の情報を格納するために使用される可能性もあります。現時点では、2 つの論理セクションが含まれています。1 つはマニフェスト情報のセクションで、もう 1 つはキャッシュされているデータのセクションです。Visual Studio Tools for Office では、Word や Excel のオブジェクト モデルを使用せずに、ドキュメントにキャッシュされているデータセットに対して直接プログラミングを行うことができます。キャッシュされているデータセットはドキュメントの構造化ストレージにシリアル化されており、アプリケーション マニフェストの CachedData セクションを通じて識別されます。

Application Manifest Editor の概要

アプリケーション マニフェストはドキュメントの構造化ストレージにシリアル化されているため、単純にテキスト エディタを使用して直接編集することはできません。Visual Studio Tools for Office には、アプリケーション マニフェストにアクセスするための ServerDocument クラスが用意されています。Application Manifest Editor は、この ServerDocument クラスを使用するサンプル ツールで、ドキュメントに埋め込まれているアプリケーション マニフェストを一度に 1 つ以上のドキュメントで調べたり変更したりできます。検索置換操作の機能や、基本的なスクリプトのシナリオをサポートする単純なコマンドライン インターフェイスも用意されています。

注意    Application Manifest Editor では、ドキュメントの読み込みや実行に影響を与えるアプリケーション マニフェストの生のプロパティを編集できます。このため、コンピュータのレジストリを編集する場合と同様に、変更を加えたことによってドキュメント ソリューションが正しく機能しなくなる可能性があります。アプリケーション マニフェストに変更を加える場合は、必ず事前にドキュメントをバックアップするようにしてください。また、結果を予測できないような値の更新は行わないでください。

Application Manifest Editor のセットアップの要件

Application Manifest Editor を使用するには、以下のソフトウェア コンポーネントがインストールされている必要があります。

  • Microsoft Visual Studio, Version 2005 Beta 1
  • Microsoft Visual Studio Tools for the Microsoft Office System, Version 2005 Beta 1
    メモ   Microsoft Visual Studio Tools for the Microsoft Office System, Version 2005 Beta 1 は Visual Studio 2005 Beta 1 に含まれています。

Application Manifest Editor ツールのチュートリアル

アプリケーション マニフェストに慣れるために、ここで実際に Visual Studio Tools for Office ドキュメントを作成し、Application Manifest Editor を使ってそれを調べてみましょう。その後、一般的な使用シナリオを通じて Application Manifest Editor の機能を紹介します。

ドキュメントの作成

まず始めに、Visual Studio 2005 を開いてプロジェクトを作成します。図 1 の新しいプロジェクト ウィザードには、"Office" というプロジェクト ノードが含まれています。ここでは、Visual Studio のプロフィールを Visual C# 開発者としてセットアップしています。環境の設定によっては、表示されるオプションが多少異なります。この記事ではすべてのサンプルで C# を使用していますが、Microsoft Visual Basic .NET を使用してソリューションを構築することもできます。

Aa537185.office_vstoapplicationmanifesteditor_figure1(ja-jp,office.11).gif

図 1. 新しいプロジェクト ウィザード


ソリューションを作成するには、次の手順に従ってください。

  1. [Visual C#] をクリックしてツリーを展開します。
  2. ツリー ビューで [Office] を選択します。
  3. 右側のペインで [Excel アプリケーション] を選択します。
  4. アプリケーションの名前を「Application Manifest Sample」に変更し、[OK] をクリックします。
  5. 次のダイアログ ボックスで、[新規ドキュメントの作成] を選択し、[完了] をクリックします。

Visual Studio Tools for Office によって、Excel のワークブックといくつかの C# クラスが作成されます。これらのクラスは、ワークブック本体とワークブックの各ワークシートを表します。ソリューションが作成されると、新しい Excel ワークブックの Sheet1 が Visual Studio に表示されます。これは、Visual Studio デザイナの中でホストされています。Excel アプリケーションの構築については、Visual Studio Tools for Office ソリューションの開発にスポットを当てた記事が既にいくつか MSDN にあるので、ここでは細かく説明しません。詳細については、MSDN の Microsoft Office Developer Center の Visual Studio Tools for the Office System 技術資料一覧 のページを参照してください。ここでは、Application Manifest Editor ツールを試すために、おなじみの "Hello World" ダイアログを Sheet1 に追加するだけです。

コードに移動するには、F7 キーを押すか、ソリューション エクスプローラで [Sheet1] を右クリックして [コードの表示] をクリックします。 以下は、ソリューション作成時に Visual Studio .NET によって生成されたコードです。追加した "Hello World" のコードは太字になっています。

 
    public partial class Sheet1
    {
        private void Sheet1_Initialize(object sender, System.EventArgs e)
        {
            MessageBox.Show("Hello World!", "VSTO Sample");
        }

        private void Sheet1_Shutdown(object sender, System.EventArgs e)
        {
        }

        region VSTO Designer generated code

        private void Startup()
        {
            this.Initialize += new System.EventHandler(Sheet1_Initialize);
            this.Shutdown += new System.EventHandler(Sheet1_Shutdown);
        }

        endregion

    }

このコードをコンパイルして実行すると (F5 キーを押します)、Excel が読み込まれて、メッセージ ボックスが表示されます (図 2 を参照)。

Aa537185.office_vstoapplicationmanifesteditor_figure2(ja-jp,office.11).gif

図 2. Excel の Hello World ダイアログ


出力の調査

Excel を終了し、Microsoft Windows エクスプローラを開いて、Visual Studio Tools for Office によって生成されたファイルを確認します。新しいプロジェクト ウィザードで既定の設定を変更していなければ、生成されたファイルは「C:\Documents and Settings\[your username]\My Documents\Visual Studio\Projects\Application Manifest Sample\Application Manifest Sample」などのディレクトリにあります。「bin\debug」ディレクトリを調べてみると、図 3 のようなファイルがあるはずです。

Aa537185.office_vstoapplicationmanifesteditor_figure3(ja-jp,office.11).gif

図 3. Visual Studio によって生成されたファイル


このディレクトリには、ドキュメント本体のほかに、ソリューションの名前が付いたアセンブリ (Application Manifest Sample.dll) があります。.pdb ファイルは、デバッグのためだけに使用されるプログラム データベース ファイルです。その他のファイルは必要な参照アセンブリで、Visual Studio .NET によってこのディレクトリにコピーされたものです。Visual Studio Tools for Office ソリューションをコンパイルすると、出力ディレクトリにドキュメントのコピーが作成され、ソリューションを実行するために必要なアプリケーション マニフェスト エントリが自動的に追加されます。

このディレクトリのドキュメントをダブルクリックすると、再びソリューションが読み込まれて、Hello World メッセージ ボックスが表示されます。Excel を終了し、Windows エクスプローラで 2 つ上のディレクトリを表示すると、Application ManifestSample.xls の別のコピーがあります。このファイルをダブルクリックすると、空のワークブックは読み込まれますが、ダイアログは表示されません。これは、このドキュメントのコピーには、関連付けられているコードを読み込む方法を知らせるアプリケーション マニフェスト エントリが含まれていないためです。

bin\debug」ディレクトリに戻ります。Visual Studio Tools for Office ランタイムがアプリケーション マニフェストをどのように使用するのかを確認するために、「bin\debug」ディレクトリから Application Manifest Sample.xls ファイルのみをコンピュータのデスクトップにコピーします。 ファイルをコピーしたら、そのデスクトップのコピーをダブルクリックします。Visual Studio Tools for Office ランタイムは、アプリケーション マニフェストを調べてアセンブリ (Application Manifest Sample.dll) を読み込もうとしますが、アセンブリは見つからず、図 4 のようなエラーが表示されます。

Aa537185.office_vstoapplicationmanifesteditor_figure4(ja-jp,office.11).gif

図 4. アセンブリ読み込みエラーのメッセージ


この例外ダイアログの [詳細] ボタンをクリックしてスタック トレースを調べると、Application Manifest Sample.dll を探しているときに "FileNotFoundException" エラーが発生したためにソリューションの読み込みに失敗したことがわかります。このエラーをデバッグするには、まず、ドキュメントのアプリケーション マニフェストを調べる必要があります。ファイルを右クリックして表示できる通常のドキュメント プロパティとは異なり、アプリケーション マニフェストはドキュメント内部の深いところに埋め込まれているため、特殊な API を使用しないとアクセスできません。Visual Studio Tools for Office には、そのために ServerDocument というクラスが用意されています。このクラスについては、後ほど詳しく説明します。

メモ   この先に進むには、ApplicationManifestEditor.msi をダウンロードしてインストールする必要があります。ApplicationManifestEditor.msi には、この記事に関連するソリューション コードが含まれています。

アプリケーション マニフェストの編集

ApplicationManifestEditor.msi をダウンロードしてまだインストーラを実行していない場合は、ここで実行してください。インストーラを実行すると、Application Manifest Editor プロジェクトがコンピュータにインストールされます。プロジェクトをインストールしたら、以下の手順に従ってコンパイルします。最後のステップで、Application Manifest Sample.xls ワークブックを Application Manifest Editor ツールで開きます。

  1. サンプル プロジェクトを開きます。

    ApplicationManifestEditor プロジェクトは既定で次のディレクトリにインストールされます。

    C:\Documents and Settings\user_name\My Documents\Visual Studio\Projects\ApplicationManifestEditorSample
    
  2. Visual Studio で、ソリューション ファイル ApplicationManifestEditor.sln を開き、F5 キーを押してソリューションをビルドして実行します。
  3. Application Manifest Editor で、[File] メニューの [Open] をクリックします。
  4. [Open] ダイアログ ボックスで、[デスクトップ] をクリックします。
  5. [Application Manifest Sample.xls] を選択し、[開く] をクリックします。

Aa537185.office_vstoapplicationmanifesteditor_figure5(ja-jp,office.11).gif

図 5. Application Manifest Editor ツールを使用して開いた Application Manifest Sample.xls


このドキュメントのアプリケーション マニフェストが表示されます (図 5)。Entry Points と Dependencies の 2 つのプライマリ ノードが含まれています。Excel ワークブックの場合、各ワークシートに 1 つずつとワークブックに 1 つのエントリ ポイントがあります。Word ドキュメントには、ドキュメントのエントリ ポイントが 1 つ含まれています。Dependencies ノードには、このソリューションを実行するために必要なすべてのアセンブリが列挙されます。

先ほどのエラーは、ランタイムが "Application Manifest Sample" アセンブリを見つけられなかったことを示しています。Dependencies ノードの依存関係のリストを順番にクリックして調べると、見つからなかったアセンブリは dependency0 であることがわかります。

Aa537185.office_vstoapplicationmanifesteditor_figure6(ja-jp,office.11).gif

図 6. プロパティ グリッドの依存関係の詳細


Visual Studio Tools for Office ランタイムは、ドキュメントに対する相対パスを使用してこれらのアセンブリを読み込みます。このため、ドキュメントがアセンブリと同じディレクトリにあったときにはアセンブリが問題なく読み込まれましたが、ドキュメンを移動したらランタイムがアセンブリを見つけられなくなりました。この問題を修正するには、AssemblyPath 属性を更新してアセンブリの場所を指定します (図 6 を参照)。筆者のコンピュータでは、アセンブリは次のディレクトリにあります。

C:\Documents and Settings\jason\My Documents\Visual Studio\Projects\Application Manifest Sample
\Application Manifest Sample\bin\Debug\Application Manifest Sample.dll

AssemblyPath 属性を更新する際には、上の例のように絶対パスを使用することも、相対パスを使用することもできます。ここでは、明確にするために絶対パスを使用しています。

ヒント   プロパティ グリッドのデータを編集する際には、Del キーの使い方に注意してください。このキーにはショートカット キーが割り当てられており、このキーを押すと作業中のノード全体が削除されます。入力ミスを修正するには、代わりに BackSpace キーを使用します。

パスを更新したら、プロパティ グリッドの別の場所をクリックし、Application Manifest Editor の [File] メニューの [Save] をクリックします。 ドキュメントを保存したら、ドキュメントを開く前に Application Manifest Editor を閉じてください。Application Manifest Editor を閉じないと、ファイルのロックが解除されません。その後、デスクトップの Application Manifest Sample.xls ファイルをダブルクリックします。再び "Hello World" メッセージ ボックスが表示されるようになったはずです。ドキュメントを開こうとするとエラーが表示される場合は、前のステップを繰り返して、入力したパスが正しいことを確認します。

Application Manifest Sample アセンブリへのパスのみを更新し、他の 4 つのアセンブリのパスは更新しないことを疑問に思った方もいるでしょう。これは、他の依存関係は Office 2003 のインストール時にすべてグローバル アセンブリ キャッシュ (GAC) に読み込まれているため、Microsoft .NET ベースの標準のプローブを使用して見つけることができるからです。GAC の使用の詳細については、「アセンブリとグローバル アセンブリ キャッシュの使用」を参照してください。

Application Manifest Editor のデバッグ

デバッグは、Application Manifest Editor の最も一般的な使用シナリオの 1 つです。デザイン時には、Visual Studio Tools for Office によってアプリケーション マニフェストのエントリ ポイントと依存関係が自動的に更新されます。しかし、コードを移動したり依存関係に変更を加えたりすることは、開発ライフ サイクル全体を通じて行われる可能性があります。そして、その結果としてエラーが発生することもあります。従来の .NET ベースのアプリケーションをデバッグする際の第 1 歩としては、ILDASM (Intermediate Language Disassembler) を実行し、変更されたり移動されたりした要素が見つかるまで依存関係やバージョン番号などを調べる方法がよく使用されます。先ほどのチュートリアルでは、Application Manifest Editor を使ったデバッグ方法を紹介しました。Visual Studio のデザイン時環境の外部で依存関係を更新したりアセンブリを移動したりしたためにソリューションが更新された場合は、このツールが役に立ちます。

キャッシュされているデータセットの調査

Visual Studio Tools for Office では、ドキュメントに埋め込まれたデータにプログラムでアクセスできるため、Office のドキュメントをデータのリポジトリとして使用することができます。データをビューから分離できるため、Office を起動したり Office のネイティブ オブジェクト モデルを使用したりしてアプリケーションをインスタンス化しなくても、サーバー上のコード (ASP.NET ページのコードなど) でドキュメントのデータを表示したり操作したりできます。図 7 は、Excel ドキュメントに埋め込まれたキャッシュされているデータセットの例です。これを、Application Manifest Editor を使用して編集できます。

Figure 7. CachedDataSet view. Click here to see larger image

図 7. キャッシュされているデータセットの表示 (画像をクリックすると拡大表示できます)


ドキュメントに埋め込まれたキャッシュされているデータセット内のデータは、図 7 のようにグリッドで入力するだけで変更できます。セルのデータ値を変更したり、行を削除したり、データの行を追加したりできます。変更をドキュメントに保存するには、[File] メニューの [Save] をクリックします。

Application Manifest Editor によるドキュメントのグループの編集

Application Manifest Editor では、一度に複数のドキュメントを操作できます。Office アプリケーションと同じように、[File] メニューの [Open] を繰り返しクリックすることで、ドキュメントをいくつも開くことができます。 ドキュメントのアプリケーション マニフェストの内容を比較したり、ドキュメントからプロパティ値をコピーして別のドキュメントに貼り付けたりする場合に便利です。

Aa537185.office_vstoapplicationmanifesteditor_figure8(ja-jp,office.11).gif

図 8. Application Manifest Editor での複数のドキュメントの表示


このほか、ディレクトリを指定して複数のドキュメントを開くこともできます。ディレクトリを指定すると、Application Manifest Editor が、アプリケーション マニフェストの情報を含むドキュメントをそのディレクトリで再帰的に検索します。この方法で複数のドキュメントを開くには、[File] メニューの [Open Directory] をクリックし、ディレクトリ ブラウザでフォルダを選択します。

アプリケーション マニフェストの検索と置換

たとえば、依存アセンブリへの参照がアプリケーション マニフェストに含まれているドキュメントがいくつかある場合に、プロジェクト マネージャからプロジェクトの命名規則を変更することを伝えられたとします。優れたツールを使用したとしても、各ドキュメントの中の参照を 1 つ 1 つ新しい命名体系に合わせて変更するには多くの時間がかかります。Application Manifest Editor を使用すると、一度に複数のドキュメントを開いて、アプリケーション マニフェストの内容を検索および置換することができます。Application Manifest Editor のツリー ビュー ペインを使用して、複数のドキュメントを同時に操作できます (図 8 を参照)。

検索置換機能では、アプリケーション マニフェストのフィールドを選択して、置き換える値を指定できます (図 9 を参照)。 正規表現を指定して検索することもできます。

Figure 9. Find and replace values. Click here to see larger image

図 9. 値の検索と置換 (画像をクリックすると拡大表示できます)


値を検索して置換するには

  1. Application Manifest Editor で、[File] メニューの [Open] または [Open Directory] をクリックして、1 つ以上のファイルを開きます。

    Aa537185.office_vstoapplicationmanifesteditor_figure10(ja-jp,office.11).gif

    図 10. Application Manifest Editor の [Open Directory] メニュー


  2. ディレクトリを選択すると、すべてのサブディレクトリで有効なドキュメントが再帰的に検索されます。このツールは .xls ドキュメントや .doc ドキュメントが見つかるたびにそれを開こうとするため、アプリケーション マニフェストが含まれていないドキュメントがあった場合は警告ダイアログが表示されます。
  3. ツリーを参照して、検索置換操作を実行するエントリ ポイントまたは依存関係の属性を選択します。図 12 の例では、依存関係の PublicKeyToken フィールドを使用しています。 プロパティ グリッドでこのフィールドを選択します。
  4. [Edit] メニューの [Find and Replace] をクリックします。 [Search and Replace] ダイアログが表示されます。

    図 9 で、既に [PublicKeyToken Field] が選択されて、このフィールドの値が [Find] テキスト ボックスにあらかじめ入力されていることに注目してください。 このダイアログ ボックスでは、選択したフィールドが識別されて既定の検索対象フィールドとして扱われます。[All Available Fields] をクリックしてすべてのフィールドで検索置換操作を行うこともできます。

  5. 置き換える値を入力し、[Replace] をクリックします。 開いているドキュメントのすべての PublicKeyToken フィールドで、[Find] テキスト ボックスに指定されている値が検索され、[Replace] テキスト ボックスの値に置き換えられます。 検索置換操作が終了すると、行われた置換の数が最後のダイアログ ボックスに表示されます (置換が行われた場合)。

アプリケーション マニフェストの項目の追加や削除

Application Manifest Editor では、マニフェストのエントリ ポイントや依存関係を追加したり削除したりすることもできます。 追加と削除のメニュー オプションを図 11 に示します。

Aa537185.office_vstoapplicationmanifesteditor_figure11(ja-jp,office.11).gif

図 11. Application Manifest Editor の [Edit] メニュー


新しい項目を追加すると、プロパティ グリッドに既定値が設定されます (図 13 を参照)。依存関係の名前は、dependencyn という命名規則に従って付けられます (n は依存関係の続き番号)。

Aa537185.office_vstoapplicationmanifesteditor_figure12(ja-jp,office.11).gif

図 12. 新しい依存関係のプロパティ グリッド


Application Manifest Editor は、名前が競合しないようにするために、最も番号の大きい依存関係を見つけてその名前を解析し、最後の数字をインクリメントします (数値だった場合)。しかし、これで名前が競合しないことが保証されるわけではありません。プロパティ グリッドの準備をして基になる dependency オブジェクトを作成するためにはこのステップが必要になりますが、ドキュメントを保存する前に、名前が一意になっていることを手動で確認するようにしてください。

注意   Application Manifest Editor では、ドキュメントの読み込みや実行に影響を与えるアプリケーション マニフェストの生のプロパティを編集できます。入力した値が正しいかどうかの確認は行われません。変更を加える前に、必ずドキュメントのバックアップ コピーを保存してください。

Application Manifest Editor で行われた編集作業の追跡

Application Manifest Editor では、ほとんどの Microsoft Windows アプリケーションと同じように、開いている各ドキュメントに対してダーティー状態フラグが保持され、未保存の変更がある場合はタイトル バーにアスタリスクが表示されます (図 13 を参照)。アプリケーション マニフェストに加えた変更は、保存しない限り基のドキュメントには反映されません。

Aa537185.office_vstoapplicationmanifesteditor_figure13(ja-jp,office.11).gif

図 13. 未保存の編集内容があることを示すインジケータ


他の標準の Windows アプリケーションと同じように、ドキュメントを閉じたりアプリケーションを終了したりするときに未保存の変更があると、変更を保存するか破棄するかをたずねるメッセージが表示されます。そこで [キャンセル] をクリックすると、変更を保存することもドキュメントを閉じることもせずにアプリケーションに戻ります。

Application Manifest Editor の操作のログへの記録

.NET Framework の Trace ライブラリを使用して、操作の単純なログが保持されます。アプリケーション構成ファイル (ApplicationManifestEditor.exe.config) を使用すると、ログの構成を変更できます。switches 要素では、ログに記録する粒度のレベルを指定できます。既定では、Application Manifest Editor はテキスト ライターを既定のログ メカニズムとして使用して、Application Manifest.log というファイルにログを書き込みます。ApplicationManifestEditor.exe.config ファイルを使用すると、この出力先をデバッグ ウィンドウ、XML ファイル、またはその他の TraceListener オブジェクトに変更できます。この構成ファイルは Application ManifestEditor.exe と同じディレクトリにあり、次のような構成セクションが含まれています。

        <switches>
            <!-- Show only errors by default. -->
            <add name="ApplicationManifestTrace" value="1" />
        </switches>
        <trace autoflush="false" indentsize="4">
            <listeners>
                <add name="TextLogListener" 
                    type="System.Diagnostics.TextWriterTraceListener"
                    initializeData="ApplicationManifest.log" />
            </listeners>
        </trace>
メモ   Trace オブジェクトへの呼び出しは、コード全体を通じて次のように行われます。この文字列が破棄されるかログに追加されるかは、トレースの構成によって決まります。
Trace.TraceInformation(
         string.Format("{0} field updated value to {1}", searchField, 
                    updatedText));
メモ    より多くの情報をログに記録するように Application Manifest Editor を強化することもできます。現在の状態では、ツールのデバッグを支援するための基本的なイベントのみがログに記録されます。

Application Manifest Editor のコマンド ライン オプション

1 つの Windows アプリケーションをコンソール アプリケーションと Windows GUI (graphical user interface) アプリケーションの両方にすることはできないため (内部 Windows メッセージ キューの初期セットアップのため)、Application Manifest Editor のコンソール バージョンは別の実行ファイルになっています。このことは、他の多くの Windows ユーティリティからもわかります。たとえば、Microsoft Visual Studio 統合開発環境 (IDE) の実行ファイルは devenv.exe ですが、コマンド ラインから devenv.com を使用して行われる作業もあります。Visual Studio のインストール ディレクトリを調べてみると、devenv の実行ファイルが 2 つあることがわかります。devenv.com はコンソール バージョンの Visual Studio で、ビルドを自動化するためによく使用されます。devenv.exe は、通常目にしている従来の Microsoft Win32 Visual Studio .NET IDE です。

表 1. Application Manifest Editor の実行ファイル


実行ファイル説明
Application ManifestEditor.exeアプリケーション マニフェストを視覚的に操作できる Windows GUI アプリケーション
Application ManifestConsole.exe1 つ以上のドキュメントの配置や更新をスクリプトで処理するのに便利なコマンドライン コンソール アプリケーション

メモ   Application Manifest Editor Windows GUI アプリケーションでは、アプリケーション マニフェストを視覚的に操作できます。コマンドライン インターフェイスでも同じ更新操作のほとんどを実行できますが (複数のドキュメントに対する正規表現の検索置換操作など)、プロパティ値を表示することはできません。
Usage: ApplicationManifestConsole [options] <file name|directory name> <field name> <search text> 
     <replace text>

Options:
        -R      Specifies <search text> is a Regular Expression.
        -D      Specifies a directory is passed instead of a file name.
                File names must include a full relative path from the execution of this tool.

Example:
        ApplicationManifestConsole.exe "..\..\My Documents\MyDocument.doc"
 AssemblyPath "MyDocuments\Administrator" "My Documents\User1"

Supported File Types:
        *.doc;*.dot;*.xls;*.xlt

Supported field names:
        All
        AssemblyPath
        Name
        Version
        PublicKeyToken
        Language

Application Manifest Editor のアーキテクチャ

Application Manifest Editor は、Microsoft .NET Framework Version 2.0 Beta 1 を使用する Windows フォーム アプリケーションとして実装されます。この記事のサンプル コードには、コンソール アプリケーションと Windows フォーム アプリケーションの 2 つのプロジェクトが含まれています。コンソール アプリケーションは、アプリケーション マニフェストを更新するための単純なコマンドライン インターフェイスを提供します。より機能豊富な GUI アプリケーションでは、すべてのアプリケーション マニフェストの内部を移動できます。

ApplicationManifestConsole.exe は、Windows フォーム ApplicationManifestEditor.exe アセンブリに依存しています。どちらのツールも、ApplicationManifestEditor.exe アセンブリの一部としてコンパイルされるモデル クラスとコントローラ クラスを使用します。代わりに、これらの共通クラスを共有 DLL へと分離することもできます。

Application Manifest Editor の画面は 2 つのペインで構成されています (図 1 を参照)。これは、新しい Windows フォーム コントロールの SplitContainer を使用して実装されています。SplitContainer コントロールは移動可能なバーで構成されており、このバーを使ってコンテナの表示領域を 2 つのサイズ変更可能なパネルに分割できます。一方のペインには、アプリケーション マニフェストの内部を階層的に移動できる TreeView コントロールがあります。もう一方のペインは、TreeView の選択内容に基づいて PropertyGrid コントロールまたは DataGridView コントロールのいずれかをホストします。

Application Manifest Editor のクラス図

図 14 は、Application Manifest Editor Windows フォーム アプリケーションのクラス図です。 テキストが灰色になっているクラスは、Visual Studio Tools for Office と .NET Framework のクラスです。

Figure 14. Class diagram. Click here to see larger image

図 14. クラス図 (画像をクリックすると拡大表示できます)


ユーザーとのやり取りのほとんどは、表 2 の Windows フォーム コントロールを通じて行われます。

表 2. Windows フォーム コントロール


コントロール説明
SplitContainer他のコントロールをホストし、ビュー ペインのサイズを変更できるようにします。
TreeView開いているドキュメントとアプリケーション マニフェストの構造を階層的に表示します。
PropertyGridVisual Studio Tools for Office のさまざまな型のプロパティを編集できます。項目のプロパティは主にリフレクションを使用して取得されます。
DataGridViewキャッシュされているデータセットを表示したり更新したりできます。

Application Manifest Editor によるドキュメントのオープン

ドキュメントを開くには、メニュー コマンドの [Open] または [Open Directory] を使用します (図 10 を参照)。メニュー項目 [Open] は、OpenFileDialog コントロールを使用します。 このダイアログは複数のファイルの選択をサポートしていますが、別のディレクトリにあるファイルを選択することはできません。

            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.Filter = "Documents (" + 
ApplicationManifestDocuments.SupportedFileTypes +
               ")|" + ApplicationManifestDocuments.SupportedFileTypes + 
"|All Files (*.*)|*.*";

            openFileDialog.Multiselect = true;
            openFileDialog.Title = "Open";

            DialogResult result = openFileDialog.ShowDialog();

            if (result == DialogResult.OK)
            {
                openDocumentsInForm(openFileDialog.FileNames);
            }

1 つ以上のドキュメントを選択すると、Application Manifest Editor が、ダイアログから取得したファイル名の配列を使用して openDocumentsInForm メソッドを呼び出します。openDocumentsInForm は、ユーザー インターフェイスを準備すると共に、ApplicationManifestDocuments クラスのインスタンスを作成する必要があるかどうかを確認します。

前にも述べたように、Visual Studio Tools for Office に用意されている ServerDocument クラスを使用すると、Office アプリケーションをインスタンス化しなくてもプログラムでドキュメントを操作できます。Office アプリケーションがインストールされている必要すらありません。Application Manifest Editor は、ServerDocument クラスを間接的に使用してドキュメントとやり取りします。オブジェクト指向の用語で言うと、ServerDocument はモデル クラスとして働き、このツールのために実装される ApplicationManifestDocuments というクラスがコントローラになります。ApplicationManifestDocuments は、ServerDocument とのやり取りをカプセル化し、1 つ以上の ServerDocument オブジェクトのコレクションを保持します。これにより、このツールで一度に複数のドキュメントを操作できるようになります。

ApplicationManifestDocuments のインスタンスが既に存在する場合、Application Manifest Editor は、Add メソッドを使用して新しいドキュメントをコレクションに追加しようとします。

            if (m_documents != null)
{
       m_documents.Add(fileNames);
            }
            else
            {
               m_documents = new ApplicationManifestDocuments(fileNames);
            }

ディレクトリを開こうとした場合は、FolderBrowserDialog コントロールが使用されます。

            FolderBrowserDialog folderDialog = new FolderBrowserDialog();

しかし、上で説明したように、openDocumentsInForm メソッドは、ApplicationManifestDocuments の新しいインスタンスを作成するかまたは既存のインスタンスにファイル名の配列を追加するために、ファイル名の配列を受け取ります。ApplicationManifestDocuments には対象となるファイルの種類がわかっているため、ディレクトリを再帰的に検索して、該当するドキュメントのファイル名の配列を返す静的メソッド、FindDocumentsInFolder が用意されています。FindDocumentsInFolder メソッドから返された配列を使用して、同じ openDocumentsInForm メソッドを呼び出すことができます。

            fileNames = ApplicationManifestDocuments.FindDocumentsInFolder(
                folderDialog.SelectedPath);

            if (fileNames != null)
            {
                openDocumentsInForm(fileNames);
            }

ApplicationManifestDocuments クラスは、ServerDocument オブジェクトの単純な配列を保持するだけではありません。この構成要素が用意されたそもそもの動機は、ServerDocument には自身が表すドキュメントのファイル名を含むプロパティが用意されていないことにあります。多数のドキュメントのリストを保持する場合は、現在作業しているドキュメントを識別できるようにする必要があります。さらに、ApplicationManifestDocuments クラスでは、ServerDocument では認識されない保留中の変更 (ダーティー状態) も追跡されます。このほか、ServerDocument のグループとのやり取りがカプセル化されており、1 つまたはすべてのドキュメントの変更を必要に応じて保存する、ドキュメントを閉じる、キャッシュされている DataSet とやり取りするなどの操作がサポートされています。

Application Manifest Editor のツリー ビューの使用

Application Manifest Editor の左ペインにあるツリー ビューでは、アプリケーション マニフェスト内を移動できます。ツリー ノードを選択すると、選択したノードの種類に応じて PropertyGrid コントロールまたは DataGridView コントロールが右側のペインに表示されます。MainForm クラスは、TreeView コントロールの AfterSelect イベントを処理し、条件ステートメントで C の is 演算子を使用して、右側のペインに表示するコントロールを特定します。 特殊化された TreeNode クラス (表 3) には、データ ビュー ペインに表示されるオブジェクトへのポインタが含まれています。

検討対象となったもう 1 つの方法では、汎用の AfterSelect で条件を確認する代わりに、select イベントを公開し、親の TreeView select イベントを登録することによってそれを発生させる共通の基本 TreeNode クラスを使用します。 この実装では、イベントを処理するためのデリゲートがメイン フォームによって各ツリー ノードに割り当てられます。 結局、AfterSelect イベントの対象となるツリー ノードの種類は 2 つだけだったので、この方法では大げさすぎます。

表 3. 特殊化された TreeNode コントロール


コントロール説明
ApplicationManifestRootTreeNodeドキュメントのルート ノードを表します。ファイル名と一意のインデックスを ApplicationManifestDocuments コンテナ クラスに格納するために使用されます。
ApplicationManifestTreeNode選択されたアプリケーション マニフェストの型に関連付けられている特殊化された TypeConverter オブジェクトへの参照を保持します。
DataViewTreeNodeドキュメントに格納されている Visual Studio Tools for Office CachedDataView オブジェクトへの参照を保持します。ドキュメントにはゼロ個以上の CachedDataView が含まれています。
DataItemTreeNode CachedDataItem としてドキュメントに格納されている DataSet への参照を保持します。1 つの CachedDataView に 1 つ以上の CachedDataItem が属しています。
DataTableTreeNode CachedDataItemDataSet に属する個々のテーブルへの参照を保持します。

ApplicationManifestRootTreeNode コントロールは特殊化された TreeNode で、ドキュメントのファイル名とインデックスを ApplicationManifestDocuments コンテナ クラスに記録します。図 15 からわかるように、ツリーの階層の深さは、オブジェクトの種類や含まれている内容によって異なります。この例では、2 つのドキュメントが開かれています (Invoice.xls と Invoice_5182004)。invoiceDataSet が選択されているドキュメントを特定するには、Application Manifest Editor はツリーを参照してドキュメントを見つける必要があります。 この場合、ApplicationManifestRootDocument ツリー ノードは Invoice.xls に設定されています。このクラスの名前を DocumentTreeNode とすることも考えられます。

Aa537185.office_vstoapplicationmanifesteditor_figure15(ja-jp,office.11).gif

図 15. アプリケーション マニフェストのツリーの構造


ServerDocument への参照を各子ノードに格納するという実装方法も考えられますが、その場合も、実際にやり取りが行われるのは ApplicationManifestDocuments コンテナであるため、このクラスへのインデックスをなんらかの方法で指定する必要があることに変わりはありません。ここでは、すべてのノードにルート ノードを格納する代わりに、必要に応じてルート ノードを計算するためのロジックを使用することにしました。getApplicationManifestRootNode メソッドは、ドキュメントのノードを見つけます。

         private ApplicationManifestRootTreeNode getApplicationManifestRootNode(TreeNode node)
        {
            ApplicationManifestRootTreeNode parentNode = node as ApplicationManifestRootTreeNode;

            // ルート ドキュメントが見つかるまでツリーをさかのぼります。
            while (parentNode == null)
            {
                if (node.Parent != null)
                {
                    node = node.Parent;
                }
                else
                {
                    // ルート ドキュメントが見つからないままツリーの一番上に到達しました。
                    break;
                }

                parentNode = node as ApplicationManifestRootTreeNode;
            }
            return parentNode;
        }

PropertyGrid コントロールの使用

Visual Studio のプロパティ ブラウザを使用したことがあれば、PropertyGrid コントロールは見慣れたものでしょう。PropertyGrid コントロールは、任意のオブジェクトや型のプロパティを表示します。項目のプロパティは、主にリフレクションを使用して取得されます。この方法を使用すると、汎用オブジェクトのプロパティ値を使いやすいコントロールに直接簡単にバインドできます。クラスで宣言型の属性を使用して、プロパティ グリッドに表示するプロパティ (BrowseableAttribute を使用)、読み取り専用にする項目 (ReadOnlyAttribute を使用)、既定値、既定のプロパティなどを指定できます。プロパティ グリッドにオブジェクトを表示するには、PropertyGrid.SelectedObject プロパティをオブジェクトのインスタンスに設定するだけです。

このスタイルのコントロールは、単純な文字列のプロパティ値で使用するにはとても便利です。しかし、より複雑なプロパティ (Dependency オブジェクトの AssemblyIdentity など) を表示する場合は、さらなる作業が必要になります。たとえば、図 16 では、Dependency オブジェクトのインスタンスが PropertyGrid に設定されています。プロパティ グリッドは、AssemblyIdentity オブジェクトを平坦な文字列に還元して表示しています。しかし、この文字列を元の意味のある形に変換する方法はわからないため、このオブジェクトは読み取り専用になっています。

Aa537185.office_vstoapplicationmanifesteditor_figure16(ja-jp,office.11).gif

図 16. プロパティ グリッドで使用されている DependencyConverter


.NET Framework の型は、TypeConverter クラスを使用することによって、Visual Studio .NET で見られるような展開に対応した編集をサポートしています。PropertyGrid で、図 17 のように AssemblyIdentity プロパティを展開できるようにするには、TypeConverter オブジェクトを作成する必要があります。PropertyGrid は、TypeConverter を使用してオブジェクトを文字列に変換し、その文字列を使用してグリッドにオブジェクトの値を表示します。編集の際には、TypeConverter によって、文字列をオブジェクトにとって意味のある元の形に変換できます。

Aa537185.office_vstoapplicationmanifesteditor_figure17(ja-jp,office.11).gif

図 17. プロパティ グリッドの Dependency オブジェクト


表 4 は、Application Manifest Editor でプロパティ グリッドにアプリケーション マニフェストを正しく表示できるようにするために実装されている TypeConverter クラスの一覧です。

表 4. 特殊化された TypeConverter


TypeConverter説明
EntryPointConverter PropertyGrid で編集可能な EntryPoint オブジェクトの意味のある文字列表現を提供します。
DependencyConverter Dependency オブジェクトのプロパティを分類し、AssemblyIdentity プロパティを展開できるようにします。
AssemblyIdentityConverter VersionPublicKeyTokenName、および Language の個々の文字列を AssemblyIdentity オブジェクトに変換することによって、AssemblyIdentity 型の展開を実現します。
VersionPropertyDescriptor4 つの独立した整数を格納する FourPartVersion 型をサポートするために AssemblyIdentityConverter TypeConverter 内に実装されている特殊化された TypeConverter です。

メイン フォームにツリー ビュー ノードが作成されるときに、各 Dependency および EntryPoint に対して ApplicationManifestTreeNode が作成されます。ツリーに表示される Visual Studio Tools for Office オブジェクトの型に基づいて適切な特殊化された TypeConverter オブジェクトがインスタンス化され、ApplicationManifestTreeNode のコンストラクタに渡されます。

    foreach (EntryPoint entryPoint in document.AppManifest.EntryPoints)
    {
        entryPointsRootNode.Nodes.Add(new
            ApplicationManifestTreeNode(new EntryPointConverter(entryPoint)));
    }
A?A…
    foreach (Dependency dependency in document.AppManifest.Dependencies)
    {
        dependanciesRootNode.Nodes.Add(new
            ApplicationManifestTreeNode(new DependencyConverter(dependency)));
    }

ツリー ビューで ApplicationManifestTreeNode を選択すると、プロパティ グリッドの SelectedObject プロパティが TypeConverter のインスタンスに設定されます。ApplicationManifestTreeNode には、TypeConverter を保持するパブリック プロパティが含まれています (次のコードを参照)。

    ApplicationManifestPropertyGrid.SelectedObject =
        ((ApplicationManifestTreeNode)e.Node).ApplicationManifestTypeConverter;

データ グリッド コントロールの使用

ServerDocument クラスの第 1 の目的は、サーバーで Office を読み込まなくても、Word ドキュメントや Excel ドキュメントの構造化ストレージ ストリームに埋め込まれているデータ アイランドをプログラムで処理できるようにすることです。

ServerDocument は基本的に、.aspx ページ内から任意の Visual Studio Tools for Office 対応ドキュメントへのアクセスをサポートするために使用されます。たとえば、多くの保険会社は、サーバーで Office のオブジェクト モデルを使用して作成および事前入力した保険証券を、Web ベースのインターフェイスを通じて保険ブローカーに提供しています。データをビューから切り離すことによって、目的のドキュメントのフォーマットがわからなくてもサーバーでデータ アイランドを設定できるようになります。クライアント側でドキュメントが Word に読み込まれると、データ連結が行われて、プレゼンテーション ビューにデータが設定されます。

ただし、ServerDocument でドキュメントのすべてのデータを操作できるわけではないという点に注意してください。操作できるのは、連結され、キャッシュするようにマークされているデータだけです。データをキャッシュするようにマークするには、DataSet の宣言を Cached 属性で修飾するだけです。

        [Microsoft.VisualStudio.OfficeTools.Interop.Runtime.Cached]
        DataSet clientProjects;

キャッシュされているデータには、ServerDocument.CachedDataManifest オブジェクトを通じてアクセスできます。マニフェストは、0 個以上のデータ ビューをサポートしています。データ ビューには、DataSet のシリアル化されたバージョンである CachedDataItem が含まれています。document.CachedDataManifest.Views コレクションの各ビューに対して、DataViewTreeNode という特殊化されたツリー ノードが作成されます。 DataViewTreeNode は、作成時に各 CachedDataItem を繰り返し処理して、それらに対応する特殊化されたツリー ノードを作成します。この時点で、データ項目の名前をアプリケーションで表示できるようになります。図 18 は、timesheetDataSet データ項目を表しています。このレベルの情報は、データセットを逆シリアル化することなく取得できます。Application Manifest Editor では多数のドキュメントを開くことができ、それぞれのドキュメントに数多くのキャッシュされたデータ項目が含まれている可能性があるため、DataSet の逆シリアル化が行われるのは実際にそれを表示する場合のみにしたいところです。このため、Application Manifest Editor では、次の DataViewTreeNode コンストラクタからわかるように、CachedDataManifest ツリー ノードは既定で折りたたまれた状態になります。

        public DataViewTreeNode(CachedDataView dataView)
        {
            m_dataView = dataView;
            base.Text = dataView.Id;

            foreach(CachedDataItem dataItem in m_dataView.CachedData)
            {
                this.Nodes.Add(new DataItemTreeNode(dataItem));
            }

            // 常に折りたたまれた状態から始まります。
            this.Collapse();
        }

Click here to see larger image

図 18. キャッシュされているデータセットの表示 (画像をクリックすると拡大表示できます)


Application Manifest Editor が DataSet を逆シリアル化して DataViewTreeNode のデータを設定するのは、ユーザーが実際にデータ ノードを展開したときだけです。図 18 では、Invoice.DataInvoice.InvoiceDataViewTreeNode です。CachedDataItem ツリー ノードの横のプラス記号 (+) は、そのノードに子がある場合にのみ表示されます。つまり、メモリ内にある要素で作成できるものだけが作成され、それ以外のものはユーザーからの要求があるまで作成されません。メイン フォームは、TreeView.BeforeExpand イベントを処理して、展開するノードが DataViewTreeNode かどうかを確認します。その後、getApplicationManifestRootNode メソッドを呼び出して ServerDocument への参照を取得し、ビューの子の各 DataItemTreeNode を繰り返し処理して、まだ作成されていない場合にのみ DataItem に対して CreateChildTableNodes を呼び出します。

ApplicationManifestDocuments クラスには、ドキュメントの開いている DataSet を追跡するために、新しい System.Collections.Generic.Dictionary オブジェクトが含まれています。このオブジェクトは、ServerDocument オブジェクトをキーとするディクショナリを作成し、各ドキュメントはそれぞれ 1 つ以上の DataSetView を含むことができるので、各 ServerDocumentDataSet のリストを DataSetViewList というクラスに保持します。

// ドキュメントをキーとして使用するデータセットのリストを保持します。
   private Dictionary<ServerDocument, DataSetViewList> m_documentDataSets;

Dictionary オブジェクトを使用すると、開いている DataSet のリストを保持できます。これにより、ダーティー状態を識別し、ユーザーが変更を保存する準備ができたら再び ServerDocument にシリアル化することができます。DataSetViewList は、CachedDataItem を使用に適した DataSet へと逆シリアル化します。 CachedDataItem はダーティー状態を追跡できませんが、DataSet は追跡できます。DataSetViewList クラスは、ServerDocumentDataView をモデルとして DataSet の多次元配列を作成することによって、アプリケーションによる状態の保持を可能にします。

DataSet はさらに、1 つ以上の DataTable を含むことができます。新しい DataGridView コントロールでは、DataGrid コントロールのように DataSet を渡してデータを編集することはできません。したがって、DataGrid コントロールを使用する代わりに、DataSet の各 DataTable に対してテーブル ツリー ノードを作成します。 そのためには、DataSetViewList によって逆シリアル化された DataSetDataItemTreeNode.CreateChildTableNodes メソッドに渡します。

        public void CreateChildTableNodes(DataSet ds)
        {
            if (ds != null && ds.Tables.Count > 0)
            {
                // データセットの各テーブルのノードを追加します。
                foreach (DataTable table in ds.Tables)
                {
                    this.Nodes.Add(new DataTableTreeNode(table));
                }
            }
        }

DataTableTreeNode には、自身が表す DataTable が含まれています。このオブジェクトは AfterSelect メソッドで使用されます。ノードの型が DataTableTreeNode だった場合は右側のペインに DataGridView コントロールが作成され、DataSourceDataTableTreeNodeDataTable に設定されます。

    else if (e.Node is DataTableTreeNode)
    {
        ApplicationManifestPropertyGrid.Visible = false;
        m_dataGrid = new DataGridView();
        this.splitContainer1.Panel2.Controls.Add(m_dataGrid);

        // 選択されたノードからテーブルを取得します。
        DataTable dt = ((DataTableTreeNode)e.Node).DataTable;
        m_dataGrid.DataSource = dt;
        m_dataGrid.Visible = true;

        dt.RowChanged += new DataRowChangeEventHandler(rowChanged);
    }

アプリケーションでダーティー フラグを保持するために、メイン フォームが DataTable.RowChanged イベントを処理して、変更が存在することをアプリケーションに通知します。 ApplicationManifestDocuments.SaveDocument メソッドでは、基になるドキュメントに DataSet があるかどうか、およびその DataSet が変更されているかどうかが確認されます。変更があった場合にのみ、DataSet が再び CachedDataItem にシリアル化されます。

検討する必要があるコードのセキュリティの問題

この記事に含まれているサンプル コードは説明のために用意されたものであり、配置されるソリューションで使用するには変更を加える必要があります。特にコードのセキュリティについて十分に検討する必要があります。

このサンプル ソリューションの単純さを示すために、Microsoft Security Developer Center の「Threat Modeling」のセクション (英語) で紹介されている脅威モデリングのプロセスおよびツールを使用して、潜在的な脅威のリストを特定しました。

特定された脅威の例を以下に示します。このソリューションを拡張または展開する前にこれらについて検討する必要があります。

表 5. セキュリティの脅威の例


脅威の影響エントリ ポイント既知の緩和策
Office ドキュメントの構造化ストレージが無効になるまたは危害を受ける開いているドキュメント信頼されているユーザー以外はドキュメントにアクセスできないようにする
XML 構成データ ファイルが危害を受けるまたは無効なデータが含まれるプログラムの初期設定構成ファイルを読み取り専用にして適切なアクセス許可を設定する

コードのセキュリティの詳細については、Microsoft セキュリティ デベロッパーセンター サイトを参照してください。

まとめ

Application Manifest Editor ツールは、アプリケーション ソリューションを背後で動かしているアプリケーション マニフェストの生の内容を編集できるようにすることによって、Visual Studio Tools for Office ソリューションの開発時のデバッグや配置を支援します。この記事に含まれているソース コードは、ServerDocument クラスの機能や、Office ドキュメントのデータとビューの分離の概念 (キャッシュされている DataSet による) を学ぶための入り口になります。

追加資料

Visual Studio Tools for Office

コードのセキュリティ

執筆者紹介

J. Jason De Lorme 氏は、Microsoft .NET および Microsoft Office で構築されたソリューションを専門とするソフトウェア設計/開発企業、Simplesheet, Inc. のプリンシパル コンサルタントです。アーリー アドプターの 1 人として、新製品、とりわけ .NET 関連の新製品を使用できることを喜んでいます。また、クライアントとの会議やコードの作成の合間を縫って、趣味のマウンテン バイクを楽しんでいます。

© 2009 Microsoft Corporation. All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker