Welcome to MSDN Blogs Sign in | Join | Help

VSTO v3 による Office 2007 プロジェクトの Windows Installer による配布方法

環境:
Visual Studio 2008
2007 Microsoft Office system 

こんにちは。

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

まず、この質問内容のインパクトを記載しましょう。ご存知の方も多いと思いますが、VSTO v3 では ClickOnce での配置を考えて設計されており、[発行] をおこなうとアドイン (アプリケーションレベル) はもちろんのこと、ドキュメントレベルの ClickOnce についても実現されているのがわかります (ドキュメントレベルの場合は、dll などが ClickOnce により配置されますので、ドキュメントは、こちら に記載されている概念と同じ要領で、ダウンロードしてから使用します。つまり、ドキュメントは利用者ごとに管理して、dll などプログラムだけを共有するという優れた考え方です。)
プロジェクトを作成して頂くとわかりますが、従来、VSTO のプロジェクトを作成すると同時に作成されていた msi のプロジェクト (セットアッププロジェクト) も無くなり、かつ MSDN の記事を見ても、Office system 2003 については Windows インストーラ (msi) による配置が記載されていますが、2007 Office system については ClickOnce を主体とした記述で、msi に関する情報がほとんどありません。(さも、「全部 ClickOnce でやってくれ」 といった感じです)

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

こうした状況の中、何でも ClickOnce で行ければ良いのですが、例えば「製品」を開発した場合など、現実の場面では、どうしても msi で配りたくなるケースが発生します。 そしてこれが簡単に行けば良いのですが、例によって若干のコツが必要となってしまうのです。

今日はその方法と考え方を記載します。

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

では、こうした背景を踏まえ、以下、実際に手順などを見ていきましょう。(すみません、別件で追われているので、画面のスナップショットなどはかなりさぼらせて頂きます、、、)

  1. まず、VSTO v3 で Office 2007 のプロジェクトを作成し、ビルドします。(メッセージボックスの出力など、簡単なテストで結構です)

  2. では、msi を作成していきましょう。
    同じソリューション内に、[セットアッププロジェクト] を追加します。

  3. セットアッププロジェクトの [アプリケーションフォルダ] に以下の 3 つを追加します。
    • プロジェクト出力 : <VSTOプロジェクト> のプライマリ出力
    • ファイル : 上記のビルドで bin/<構成> ディレクトリ下に出力された .vsto ファイル
    • ファイル : 上記のビルドで bin/<構成> ディレクトリ下に出力された .manifest ファイル

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

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

    HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\AddIns\<プロジェクト名 (例 : 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. また、インストーラによるネットワーク接続を拒絶したい場合には (デフォルトでは、必要コンポーネントをインターネットに接続して取りに行きます)、セットアッププロジェクトのプロパティを開き [必須コンポーネント ...] ボタンを押して、[アプリケーションと同じ場所から必須コンポーネントをダウンロードする] にチェックをつけてインストーラを作成してください。

以上で "いったんは" 完了です。 

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


これはいったい何でしょうか?実はここで、先ほどの 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 セッションがありますので、ご期待ください!)

 

Published Monday, March 31, 2008 5:28 PM by tsmatsuz
Filed under:

Comments

# Basketball Chat &raquo; Blog Archive &raquo; VSTO v3 ????????? Office 2007 ????????????????????? Windows Installer ?????????????????????

Anonymous comments are disabled
 
Page view tracker