Uncategorized

Office 2007 アプリケーションの Windows Installer による配布方法 (VSTO v3 編)

(Office 2003 (及び、VSTO 2005) については、こちら の記事を参照してください)

環境:
Visual Studio 2008
2007 Microsoft Office system 

こんにちは。

現在、つぎなる技術訴求に向けて猛烈に準備中ですが、先日、福井で INETA & Microsoft 協賛のセミナーがあり、表題のご質問を頂きましたので、ブログにて記載させていただくことにします。

まず、この質問 (表題) の背景とインパクトを記載しましょう。

ご存知の方も多いと思いますが、VSTO v3 では ClickOnce での配置を考慮して設計されており、[発行] をおこなうとアドイン (アプリケーションレベル) はもちろんのこと、ドキュメントレベルのカスタムアプリケーションの ClickOnce も実現されているのがわかります。(ただし、ドキュメントレベルの場合は、.dll などが ClickOnce により配置されますので、ドキュメントは、こちら に記載されている概念と同じ要領で、ダウンロードしてから使用します。つまり、ドキュメントは利用者ごとに管理して、dll などプログラムだけを共有するという優れた考え方です。)

Visual Studio 2008 で Office のプロジェクトを作成して頂くとわかりますが、従来、VSTO のプロジェクトを作成すると同時に作成されていた msi のプロジェクト (Windows Installer によるセットアッププロジェクト) も無くなり、かつ MSDN の記事を見ても、2007 Office system については ClickOnce を主体とした記述ばかりで、msi (Windows Installer) を使った配布方法の情報がほとんどありません。(さも、「全部 ClickOnce でやってくれ」 といった感じです。)
すべて ClickOnce で済めば良いのですが、例えば「製品」を開発した場合など、現実には、どうしても msi で配りたくなるケースが発生するはずです。 

MSDN : Office ソリューションの配置
http://msdn2.microsoft.com/ja-jp/library/bb157879.aspx

以前の VSTO 2005 時代の msi による配置については、VSTO 固有のコードアクセスセキュリティの要件があり、こちらのブログ に記載したように裏ワザ的な方法が必要でした。VSTO v3 からは、ClickOnce への対応などを可能とするため、こちら (この頃は、VSTO v3 もまだベータ版で ClickOnce が開発途中でありました、、、) に記載したように、「Inclusion List」と呼ばれる、いわば VSTO 版のセキュリティテーブルが使われるようになり、以前紹介した技はそのまま使えなくなっています。

こうした背景を踏まえ、以下に、Office 2007 と Visual Studio 2008 を使って、インストーラー (msi) を作成する手順を見てみましょう。

なお、以下の説明では、画面のスナップショットなどはかなり省略させて頂きますが、セットアップ プロジェクトの作成手順の詳細は こちらの VSTO 2005 の頃のインストーラー作成の記事 を参照してください。(上述したように、セキュリティの考え方が以前とはまったく異なっており、コード アクセス セキュリティ ではなく、下記の Inclusion List を使った方法に変更されているので注意してください。その他の概念は同様です。)

  1. まず、VSTO v3 で Office 2007 のプロジェクトを作成し、ビルドします。(メッセージボックスの出力など、簡単なテストで結構です)
  2. では、msi を作成していきましょう。
    同じソリューション内に、[セットアッププロジェクト] を追加します。
  3. セットアッププロジェクトの [アプリケーションフォルダ] に以下の 3 つを追加します。
    • プロジェクト出力 : <VSTOプロジェクト> のプライマリ出力
    • ファイル : 上記のビルドで bin/<構成> ディレクトリ下に出力された .vsto ファイル
    • ファイル : 上記のビルドで bin/<構成> ディレクトリ下に出力された .manifest ファイル

ドキュメントレベルのプロジェクトであればこれで完了ですが、アプリケーションレベル (つまり AddIn) の場合には、ユーザのレジストリに、このアドインを登録する必要がありますので、さらに以下を実施します。

  1. ソリューションエクスプローラを右クリックし、[表示] – [レジストリ] で以下のエントリを追加します。

    HKEY_CURRENT_USERSoftwareMicrosoftOfficeExcelAddIns<プロジェクト名 (例 : Test.ExcelAddIn1,  など)>

  2. 上記のキーの中に、以下の値 (Value) を追加します
    • 文字列値 : Description
      <プロジェクトの正式名> (例 : Excel Demo AddIn)
    • 文字列値 : FriendlyName
      <プロジェクトの正式名> (例 : Excel Demo AddIn)
    • DWORD値 : LoadBehavior
      3 (← デフォルトでロードする、という意味です)
    • 文字列値 : Manifest
      [TARGETDIR]<.vsto ファイルの名前>|vstolocal (例 : [TARGETDIR]ExcelAddIn.vsto|vstolocal)
  3. セットアッププロジェクトのプロパティを開き、[必須コンポーネント …] ボタンを押して、必須コンポーネントとして[Visual Studio Tools for the Office system 3.0 Runtime] をチェックします。
  4. また、インストーラによるネットワーク接続を拒絶したい場合には (デフォルトでは、必要コンポーネントをインターネットに接続して取りに行きます)、セットアッププロジェクトのプロパティを開き [必須コンポーネント …] ボタンを押して、[アプリケーションと同じ場所から必須コンポーネントをダウンロードする] にチェックをつけてインストーラを作成してください。

以上で “いったんは” 完了です。 
 このセットアップ プロジェクトをビルドしてインストーラーを作成し、作成されたインストーラー (msi) を別のマシン上などで実行してインストールをおこなってください。

そして、アプリケーションを実行してみてください。
最初に実行して頂くとわかりますが、不明な署名のプログラムに対してインストールを許可するかどうか確認する以下のダイアログボックスが表示されるのがわかります。

これはいったい何でしょうか?実はここで、先ほどの Inclusion List の登場です。

この画面が表示される理由は、Inclusion List (俗な言い方ですがセキュリティテーブル) にアプリケーションが登録されていないために表示されるもので、[インストール] をユーザが選択したときにはじめてユーザの Inclusion List にセキュリティ情報の登録がおこなわれ、以降、使用可能になります。つまり、VSTO 2005 の頃と同様、ファイルを置いただけではプログラムは実行できないようになっていて、このようにユーザが明示的にアクションをおこなうか、許可されたコードで設定をおこなわない限り、プログラムは動作しない仕様となっています。(VSTO 2005 の頃はコードアクセスセキュリティの設定をしていないとダイアログすら出てこなかったわけですから、かなりの進歩だと思ってください、、、)

さて、ここで話を終えても、開発者の皆さんは「さすが!セキュリティに配慮されているんだ、感心、感心、、、」とは納得されないでしょう。そもそも msi ではユーザが能動的に「インストール」をおこなっているわけで、インストールボタンが 2 回出てくるというのは頂けません。さらに上記のように登録された Inclusion List 上のデータは、アンインストールの際に何も実施していないのでゴミのように残り続けます。

そこで、こちらのブログ に記載した方法と同様の要領で、インストーラのコードから Inclusion List に登録をしてしまおうという話になってきます。下記の通り実施します。

なお、カスタムアクションによるレジストリ変更などのトラブルについて開発者の方で責任を持って頂けるという前提で記載しています。サンプルは、以下のサイトからダウンロードすることが可能です。

MSDN Code Gallery : Deploying a VSTO 3.0 solution for the Office 2007 using Windows Installers 
http://code.msdn.microsoft.com/VSTO3MSI/Release/ProjectReleases.aspx?ReleaseId=729

  1. では、続きを作成していきましょう。
    まず、さきほど作成したソリューション内に、Inclusion List を更新するため、クラスライブラリのプロジェクトを追加します。
    そして、上記のダウンロードサンプルコードにあるように、以下のコードを記述してクラスを実装します。得体不明の文字列部分は、上記の VSTO プロジェクトで作成された .manifest ファイルを開き、<RSAKeyValue> 要素を見つけ (2 箇所ありますが同じです)、そのままコピーしてください。

    (※ このソースコードには、Install メソッド (インストールアクション)、UnInstall メソッド (アンインストールアクション)、Commit メソッド (確定アクション)、Rollback メソッド (ロールバックアクション) のすべてが実装されていることに注意してください。以降では、これらすべてのアクションを設定していきます。)

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Configuration.Install;
    using System.Security;
    using System.Security.Permissions;
    using Microsoft.VisualStudio.Tools.Office.Runtime.Security;

    namespace InclusionListCustomActions
    {
        [RunInstaller(true)]
        public class TrustInstaller
            : Installer
        {
            const string RSA_PublicKey = @”<RSAKeyValue><Modulus>0VjTVM/DV60EG+n1FvletQlhgsvxny0FrqqApTHfr+Tjvokfpftqg3f30NF0J+HwLHeCJsoGMvKtVntRbvO0j/iriBivPIMXIBjZoea/OT+TlBvS1kH3w3H+TmIcQosQ1Nf1J7gfO3X6WGHBu8GhWb2llJJ3sK+s6xIIUgQzzh0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>”;

            public override void Install(IDictionary stateSaver)
            {
                try
                {
                    SecurityPermission permission =
                        new SecurityPermission(PermissionState.Unrestricted);
                    permission.Demand();
                }
                catch (SecurityException)
                {
                    throw new InstallException(
                        “You have insufficient privileges to ” +
                        “register a trust relationship. Start Excel ” +
                        “and confirm the trust dialog to run the addin.”);
                }

                Uri deploymentManifestLocation = null;

                if (Uri.TryCreate(Context.Parameters[“deploymentManifestLocation”],
                    UriKind.RelativeOrAbsolute, out deploymentManifestLocation) == false)
                {
                    throw new InstallException(
                        “The location of the deployment manifest is missing or invalid.”);
                }

                AddInSecurityEntry entry = new AddInSecurityEntry(
                                deploymentManifestLocation, RSA_PublicKey);
                UserInclusionList.Add(entry);
                stateSaver.Add(“entryKey”, deploymentManifestLocation);
                base.Install(stateSaver);
            }

            public override void Uninstall(IDictionary savedState)
            {
                Uri deploymentManifestLocation = (Uri)savedState[“entryKey”];
                if (deploymentManifestLocation != null)
                {
                    UserInclusionList.Remove(deploymentManifestLocation);
                }
                base.Uninstall(savedState);
            }

            public override void Commit(IDictionary savedState)
            {
                base.Commit(savedState);
            }

            public override void Rollback(IDictionary savedState)
            {
                base.Rollback(savedState);
            }
        }
    }

  2. さきほど作成したセットアッププロジェクトの [アプリケーションフォルダ] に以下 (上記のクラス) を追加します

    プロジェクト出力 : <上記で追加したカスタムアクションのプロジェクト> のプライマリ出力

  3. ソリューションエクスプローラでセットアッププロジェクトを右クリックし、[表示] – [カスタム動作] で表示されるウィンドウ上の [インストール] ノードを右クリックして、[カスタム動作の追加] を右クリックします。
    そして、表示されるフォルダで、[アプリケーションフォルダ] の中の、上記で追加した「カスタムアクションの出力」を選択して追加します。(こちら と同じ要領です)
  4. 追加されたカスタムアクションのプロパティウィンドウの [CustomActinData] に、以下を記入します。

    /deploymentManifestLocation=”[TARGETDIR]<プロジェクトが出力した .vsto ファイルの名前>”

    (例 : /deploymentManifestLocation=”[TARGETDIR]ExcelAddIn.vsto”)

  5. 同様に、今度は、[アンインストール] ノードに同じくカスタムアクションの出力を追加し、
    こんどは、[CustomActionData] プロパティは空のままで結構です。
  6. 同様に、[確定] ノードに同じ dll のアクションを追加し、おなじく [CustomActionData] プロパティは空のままで結構です。
  7. [ロールバック] ノードも同じく dll のアクションを追加し、おなじく [CustomActionData] プロパティは空のままで結構です。

以上で完了しました。 

今度は、もう例のダイアログが表示されないことがわかります。

なお、プロジェクトにゴミのようにたくさんの dll が配置されていると思いますが、これは PIA (2007 Microsoft Office Primary Interrop Assemblies) と呼ばれるもので、これらを [必須コンポーネント] として初回のみインストールし、以降は再利用することが可能ですが、少々面倒な設定が必要になりますので、ここでは省略します。(これについては、Visual Studio 2005 Tools for Office Second Edition (VSTO SE) の頃の以下の記事に記載されています。この中にある ComponentCheck.cpp は上記のサンプル内に入っています。)

MSDN : Windows インストーラを使用して Visual Studio 2005 Tools for Office Second Edition ソリューションを配置する
http://www.microsoft.com/japan/msdn/office/2007/bb332051.aspx

ClickOnce をはじめとした VSTO v3 以降のクライアント系の Office 開発 (VSTO 等) については、エバンジェリスト 小高 がイベントや Web キャストなどでいろいろとご紹介していますので、是非参考にしてみてください (Microsoft Conference でも小高の VSTO セッションがありますので、ご期待ください!)

 

Advertisements

Categories: Uncategorized

Tagged as:

2 replies »

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s