misc.log

日常茶飯事とお仕事と

Visual Studio 2005 + VSTO on Windows 7でExcelアプリを作ってmsi形式でインストールする

いやもう、なんというか大変。

Visual Studio 2005に、VSTO(Visual Studio Tools for Office)を入れて、Office 2003用のExcelに.NETで追加機能を付けたものを作り、さらにそれをmsi形式でインストールしようという試み。制限時間は4時間半。

環境構築

なんだか知らないけれど四苦八苦しました。何だか知らないうちに解決したのでとりあえずそこは触れないようにしておきます。

VSTOアプリを作る

下記の内容を参考にして、とりあえずボタンを押すとHello WorldExcelアプリを作ります。

Office 2003 アプリケーションの Windows Installer (msi) による配布方法/松崎 剛blog
http://blogs.msdn.com/b/tsmatsuz/archive/2006/08/02/office-2003.aspx

セットアッププロジェクトを作る

上記URLにある方法で、カスタムアクションを含めたインストーラーを作りましょう。

動かす……エラーになる

Windows 7上で出来上がったインストーラーを動かすと、こんなエラーが出てインストールは強制終了されてしまいます。

このパッケージをインストールするときに予期しないエラーが検出されました。
このパッケージは問題がある可能性があります。
エラーコードは 2869 です。

エラーの詳細を調べる

MSI形式のインストーラーは、処理過程を詳細なログに残すことができます。下記のコマンドでログを出力させましょう。MSIファイルやフォルダは適宜書き換えてください。

msiexec /i VSTOTest.msi /L*v "c:\VSTOTest\install.log"

この方法は下記ブログを参考させていただきました。

Setup.exeで詳細ログを出力する方法/ぷりんすの開発メモ
http://prins-note.blogspot.jp/2010/12/setupexe.html

エラー詳細から解決方法を探る

マイクロソフトの人が詳しいことを書いてくださってます。どうやらVisual Studio 2005で作成するインストーラーと、Vista以降のWindowsの組み合わせで起きるハンドルリークが原因だそうで。

[Step by Step Guide] MSI 詳細ログからエラーの原因を特定する例/Visual Studioサポートチームblog
http://blogs.msdn.com/b/jpvsblog/archive/2011/05/27/step-by-step-guide-msi.aspx

インストーラーがエラー時には「戻り値 3」を返すことから、それをキーワードにログを検索、そこから手繰っていくようです。

そうすると、こんなエラーが出てました。

MSI (s) (8C!94) [15:33:20:046]: Note: 1: 2262 2: Error 3: -2147287038 
MSI (s) (8C!94) [15:33:20:046]: 
MSI (s) (8C:6C) [15:33:20:046]: Leaked MSIHANDLE (36) of type 790531 for thread 1428
MSI (s) (8C:6C) [15:33:20:046]: Note: 1: 2769 2: _BB8FCCAB_2B23_441F_9996_B2740E019658.install 3: 1 
MSI (s) (8C:6C) [15:33:20:046]: Note: 1: 2262 2: Error 3: -2147287038 
DEBUG: Error 2769:  Custom Action _BB8FCCAB_2B23_441F_9996_B2740E019658.install did not close 1 MSIHANDLEs.
このパッケージをインストールするときに予期しないエラーが検出されました。このパッケージは問題がある可能性があります。エラー コードは 2769 です。 引数: _BB8FCCAB_2B23_441F_9996_B2740E019658.install, 1, 
CustomAction _BB8FCCAB_2B23_441F_9996_B2740E019658.install returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
操作終了 15:33:20: InstallFinalize。 戻り値 3。

「Leaked MSIHANDLE」というやつですね。

これ、結論からいうと「NoImpersonate」というフラグを設定してやる必要があり、それには方法が2つ。1つはVisual Studio 2008以降のバージョンを使うというもの。もう1つは、JavaScriptを使ったスクリプトをインストール処理中に実行させる必要がある、ということらしいです。

JavaScriptでフラグを設定する方法について、詳細は下記のブログに記載されています(英語)。こちらも簡単に説明すると、フラグ設定のためのスクリプトを、セットアッププロジェクトのプロパティ設定にある「PostBuild」設定に登録、ビルド後に処理を強制実行させるというもののようです。

Script to set NoImpersonate bit for custom actions in Visual Studio 2005 setup projects
http://blogs.msdn.com/b/astebner/archive/2007/05/28/2958062.aspx

※この先は今から試します

速報!ダメでした!(笑)

疑問

Visual Studio 2005はそもそも、Windows 7と互換が無く専用のパッチを当てないと警告がでるような状態ですが、それが原因なのでしょうか?
今回、VSTO開発環境を作るために試行錯誤する中で、このパッチを当てたときにOfficeプロジェクトがうまく作れないというもんだいがあったことから、パッチを当てずに作業しています。それが原因なのかな????