Microsoft Office の Publish (発行) による自動更新 (Web サーバーへの発行)


【環境】
Microsoft Office 2003
Visual Stuio 2005 Tools for the Microsoft Office system
Internet Information Services (IIS) 6.0

こんにちは。

今日は、現在 連続物で掲載途中の「Orcas でみる VSTO の新機能」シリーズではなく、以前までの VSTO に関する自動更新の方法について記載します。
なぜ Orcas が近い今頃になってこのテクノロジーを紹介するかというと、この後、ブログにて、Orcas で可能になっている the Microsoft Office system 2007 の ClickOnce について説明したいと思いますので、その準備資料として掲載したいためです。(すみません、今日はもう時間がないので、ClickOnce についてはまた来週以降の時間のある折に方法を記載します。)

Microsoft Office 2003 と VSTO を使って、どの程度まで自動更新の仕組みを実装できるか紹介します。

まず、テクノロジーの背景を非常に簡潔ですが記載しておきます。

Microsoft Office のクライアントは、ご存知の方も多いかと思いますがアンマネージです (これは、残念ながら the Microsoft Office system 2007 のクライアントでも変わりません)。このため、Office 上での CLR の起動と連携には VSTO のランタイムによる独自の方法が採用されていて、VSTO v2 (Microsoft Office 2003 で使うことができていたこれまでの VSTO) までは、同一のアプリケーションドメイン上で実行されてしまうという動きになっていました。このため、CLR の上では、セキュリティについてもそのドメイン (Office が起動するランタイムのデフォルトアプリケーションドメイン) を信頼してしまうと、すべての VSTO のアプリケーションが信頼されることになってしまうという問題があり、セキュリティ上のリスクとならないよう、VSTO 独自の方法でセキュリティの解決をおこなう仕組みになっていました。
そしてこの仕組みが原因で、VSTO のアプリケーションを使う利用者側 (利用するクライアント側) は、.NET の標準的なコードアクセスセキュリティとは別の、アプリケーションごとの特別なコードアクセスセキュリティの設定が必要になっていました。これは、当然、実際の展開の障壁となります。

よって、これを回避する一般的方法として、MSI による配布をおこなって、そのインストーラのカスタムアクションとしてインストール時にコードアクセスセキュリティを自動で設定するなどの方法が頻繁に用いられてきました。(この具体的方法を知りたい方は、昔記載したこのブログ を参考にしてください。)

さて、こうした課題をかかえながらも、一度コードアクセスセキュリティさえ設定してしまえば、あとはアプリケーションの更新を自動化するということは実は可能です。Microsoft Office 文書を使ったアプリケーションの自動更新は、実際に使う場面を連想してもらうとわかりますが、ドキュメント (Excel のワークシートや Word のドキュメント) そのものを共有したりすると、ドキュメントに対して個人がおこなった変更などが消えてしまいます。このため、VSTO では、もっと賢く、ドキュメントは個別に管理して、ドキュメントに添付されているコード (VSTO で作成したアセンブリ) のみを共有して更新するという方法が提供されています。

では、その方法について説明します。
方法としては、共有フォルダに発行したり、Web サーバに発行したりといった方法で可能ですが、今回は、Web サーバ (IIS) を使った発行を例に説明しましょう。

まず、先ほど記載したように、ドキュメントとアセンブリを分離して管理することができるわけですが、この分離を実現するために、VSTO v2 では、ドキュメントのマニフェストと、アセンブリのマニフェストという2つマニフェストの概念が存在しています。
では、手順を説明します。

  1. Visual Studio 2005 (VSTO の入っているもの) を使用して、[Visual C#] - [Office] の [Excel ブック] プロジェクトを選択します。
  2. 簡単な MessageBox の出力をおこなうアプリケーションを作成しましょう。
    ThisWorkbook.cs のコードを表示し、以下の通り実装します。

    private void ThisWorkbook_Startup(object sender, System.EventArgs e)
    {
        MessageBox.Show("テスト1");
    }
  3. ソリューションエクスプローラからプロジェクトを右クリックし、[発行 ...] を選択して、IIS (Webサイト) 上に発行します。

「作る側」の設定はこれで完了です。

まず、上記で発行した Excel (xlsファイル) のワークブックにブラウザからアクセスし、ブック (ファイル) をデスクトップ上などローカルに保存 (ダウンロード) しましょう。

そして、ダウンロードしたファイルを実行してみてください。
セキュリティに違反しているため、エラーのダイアログボックスが表示されるはずです。

上述した通り、「使う側」でコードアクセスセキュリティなどの設定をおこなう必要があります。(使う側は VSTO のランタイムも必要ですが、これは初回に1回だけ実施しておけばOKです。) 
以下の通り設定します。

  1. Windows の管理ツールから [Microsoft .NET Framework 2.0 構成] を起動します。
  2. [ランタイム セキュリティ ポリシー] の中の [コンピュータ] - [コード グループ] - [All_Code] - [LocalIntranetZone] の下に、新しいコードグループを作成します。
    コードグループの作成ダイアログボックスで、コードグループの条件として [URL] を選択し、
    URL の入力欄に、上記の Deploy した URL を下記のように記入してください。

    (例) http://matsumachine01/ExcelWorkbook3/*

    尚、ここの入力は注意してください。デプロイされたマニフェストファイル (テキストファイルです) の中身を確認し、同じように入力をすることをおすすめします。例えば、上記の例では、 matsumachine01 がたとえ localhost と同一であったもマニフェストに matsumachine01 と書かれている場合は、localhost と書くと動作しない可能性があります。
  3. また、アクセス許可セットとして、[FullTrust] を選択します。

注記 : .NET Framework 構成ツール (上記の UI) が入っていない場合は、代わりに caspol.exe を使用してコマンドラインでグループを追加できます。この際、使用する caspol.exe のバージョンに注意してください。(%windir%Microsoft.NET の使用するバージョン フォルダーの下の caspol.exe を使用してください。)

では動かしてみましょう。
Visual Studio など、VSTO 関連のアプリケーションは一旦すべて終了させてください。(理由は上述の通り、同一のドメインなどを使用している可能性があるためです。l)

今度は正しく実行されると思います。

次に、Visual Studio を起動して、再度、上記のプロジェクトを開いて、以下の通りソースを更新してみましょう。

private void ThisWorkbook_Startup(object sender, System.EventArgs e)
{
    MessageBox.Show("テスト2");
}

再度、同じ場所 (Web サイトの同じ URL) に発行をおこない、Visual Studio など、VSTO 関連のアプリケーションは一旦すべて終了させてください。(念のため、忘れずに!)
デスクトップ上に保存した先ほどの xls ファイルを実行すると、xls ファイルをダウンロードしていなにも係わらず、新しいコードが実行されるはずです。(理由は、ドキュメントのマニフェストが xls ファイルの中に入っており、このマニフェストによって、IIS 上のコードを実行するように指定されているためです。)

このように、Microsoft Office 2003 においても、ブックとコードを分離した賢い自動更新の仕組みを実現できます。ただし、上記でみていただいておわかりの通り、クライアントにセキュリティの設定が必要など (つまり ClickOnce と違って、管理者権限も必要です) いくつかの課題が含まれているという点も理解しておきましょう。

ということで、またお時間ができたら、新しい VSTO で可能な ClickOnce について記載します。

 

Comments (1)

  1. こんにちは。 現在、つぎなる技術訴求に向けて猛烈に準備中ですが、先日、福井で INETA & Microsoft 協賛のセミナーがあり、上記タイトルのご質問を頂きました。 通常、セミナーなどで頂くご質問はご本人に回答するのですが、このご質問、大変影響も大きく、そしてコツの居る内容ですので、ブログにて記載させていただくことにします。

Skip to main content