• 追加された行はこの色です。
  • 削除された行はこの色です。
*.NETプログラミング研究 第59号 [#ac88c779]

**.NET Tips [#o9113d2a]

VS.NETのデプロイメントプロジェクトにおけるTipをいくつか紹介します。

***インストール時にインストール先のフォルダパスをレジストリに書き込む [#hc18c89d]

インストール時にレジストリに値を書き込むには、VS.NETのレジストリエディタを使用します。このレジストリエディタで追加できる名前や値にはWindows Installerのプロパティを使用できるようなので(ヘルプには明記されていないようですが)、インストール先のフォルダパスを表す[TARGETDIR]プロパティを利用して、レジストリエディタに値を追加すればよいでしょう。

具体的な方法を示します。ここでは、レジストリキー「HKCU\Software\[Manufacturer]\[ProductName]」に名前「Path」で値がインストールしたパスとなる値を書き込むようにします。例えばデプロイメントプロジェクトのManufacturerプロパティが「既定の会社名」でProductNameプロパティが「Setup1」の場合は、「HKCU\Software\既定の会社名\Setup1」というキーに書き込まれます。

まず、レジストリエディタを開きます。ソリューションエクスプローラーでデプロイメントプロジェクトを右クリックしてコンテキストメニューを表示し、「表示」-「レジスト」を選択すればレジストリエディタが開きます。

次にレジストリキー「HKCU\Software\[Manufacturer]\[ProductName]」を作成します。レジストリエディタの左側のツリーで「HKCU\Software\[Manufacturer]」を右クリックし、メニューから「新規作成」-「キー」を選択してキーを作成します。そのキーの名前を、「[ProductName]」に変更します。

それから、このキーに値を追加します。ツリーで「HKCU\Software\[Manufacturer]\[ProductName]」を選択してから、右側のペインで右クリックしてメニューを表示します。ここで「新規作成」-「文字列の値」を選択し、追加される値のNameプロパティを「Path」、Valueプロパティを「[TARGETDIR]」とします。

これでインストールしたパスがレジストリに書き込まれるようになります。

***アドバタイズショートカットではなく、普通のショートカットを作成する [#d3e8bef6]

VS.NETの「ファイルシステムエディタ」を使用することにより、インストール時にショートカットを作成することが簡単にできますが、このようにして作成されるショートカットはアドバタイズショートカット(Advertisable shortcut)となります。

アドバタイズショートカットはリンク先のファイルが存在しなくても実行することができるというWindows Installerの優れた機能ですが、困ったことも多々あります。普通のショートカットでは、エクスプローラからファイルをドロップすると、そのファイルのパスをコマンドライン引数にしてリンク先のアプリケーションを実行しますが、アドバタイズショートカットではこれができません。よって、Windowsの「送る」フォルダにショートカットを作成しても正常に機能しませんし、デスクトップにシュートカットを作成してこのシュートカットにファイルをドロップすることによってアプリケーションを起動するといったこともできません。

ここではアドバタイズショートカットではなく、普通のショートカットを作成する方法を幾つか紹介します。

一番簡単な方法は、DISABLEADVTSHORTCUTSプロパティを設定することでしょう。これにより、アドバタイズショートカットが作成されなくなります。

-[[DISABLEADVTSHORTCUTS Property>http://msdn.microsoft.com/library/en-us/msi/setup/disableadvtshortcuts.asp]]

DISABLEADVTSHORTCUTSプロパティを設定する方法としては、msiexecのコマンドライン引数で指定するか、Windows InstallerデータベースのPropertyテーブルで指定するかということになります。

msiexecのコマンドライン引数で指定する方法とは、MSIファイルをインストールするときに次のようなコマンドを使用する方法です。

msiexec /i (MSIファイル名) DISABLEADVTSHORTCUTS=1

Windows InstallerデータベースのPropertyテーブルで指定する方法とは、OrcaでMSIファイルを開き、PropertyテーブルにProperty「DISABLEADVTSHORTCUTS」、Value「1」の行を追加する方法です。

このようにDISABLEADVTSHORTCUTSプロパティを使った方法では、すべてのショートカットが通常のショートカットとなります。特定のシュートカットのみ普通のシュートカットにするには、Windows InstallerデータベースのShortcutテーブルをいじることになります。

まず、MSIファイルをOrcaで開き、Shortcutテーブルを表示します。そこで普通のシュートカットにしたい設定の行を探し、Target列をショートカットのリンク先のパス(通常は「[TARGETDIR]\<ファイル名>」)に変更します。さらに、Icon_列を空白にします。これで保存すれば完了です。

***環境変数Pathにパスを追加する [#xaba5718]

環境変数に変数を追加、変更、削除するには、Windows InstallerデータベースのEnvironmentテーブルを使います。このEnvironmentテーブルはVS.NETで操作できませんので、Orcaなどを使って編集する必要があります(さもなくば、カスタムアクションを使うことになるでしょう)。ここでは具体的に環境変数Pathにインストールしたパスを追加する方法を説明します。

まずMSIファイルをOrcaで開きます。そして、Environmentテーブルに次のような行を追加します。なお詳しくは、ヘルプをご覧ください。

-[[Environment Table>http://msdn.microsoft.com/library/en-us/msi/setup/environment_table.asp]]

#pre{{
Environment
Path

Name
*=-Path

Value
[~];[TARGETDIR]

Component_
Enviroment
}}

補足:NT系OSではName列の先頭に「*」を付けるとシステム環境変数に書き込まれ、付けないとユーザー環境変数に書き込まれます。詳しくはヘルプのRemarksをご覧ください。

またComponentテーブルに次のような行を追加します。

#pre{{
Component
Enviroment

ComponentID
(適当なGUID)

Directory_
TARGETDIR

Attributes
0
}}

さらにFeatureComponentsテーブルに次のような行を追加します。

#pre{{
Feature_
DefaultFeature

Component_
Enviroment
}}

これで保存すればOKです。

また、環境変数の値を取得するには、「[%(環境変数の名前)]」のようにします。例えばカスタム動作のCustomActionDataプロパティにより環境変数Pathを取得するには、CustomActionDataに「[%Path]」と指定します。

-[[Formatted>http://msdn.microsoft.com/library/en-us/msi/setup/formatted.asp]]

***インストール終了後に再起動する [#s7767307]

インストール後(あるいはインストール中)にシステムの再起動を行うには、スタンダードアクションのScheduleRebootやForceRebootを使います。ScheduleRebootはインストールの最後に再起動し、ForceRebootは途中でも再起動できます。VS.NETではこれらのアクションを追加することはできませんので、これらを使うにはOrcaを使用します。

-[[System Reboots>http://msdn.microsoft.com/library/en-us/msi/setup/system_reboots.asp]]
-[[ScheduleReboot Action>http://msdn.microsoft.com/library/en-us/msi/setup/schedulereboot_action.asp]]
-[[ForceReboot Action>http://msdn.microsoft.com/library/en-us/msi/setup/forcereboot_action.asp]]

性格上、ForceRebootの方が使い方が難しいので、ここではScheduleRebootをInstallExecuteSequenceテーブルに挿入することにします。

まずOrcaでMSIファイルを開き、InstallExecuteSequenceテーブルを表示します。ヘルプによると、ScheduleRebootの挿入位置は、通常は最後ですが、どこでもよいということです。よって、ここでは次のような行をInstallExecuteSequenceに追加します。

#pre{{
Action
ScheduleReboot

Condition

Sequence
7000
}}

このようなMSIファイルを実行すると、インストール終了後に再起動を求めるダイアログが表示されます。ユーザーはここで再起動しないように選択することもできます。サイレントインストールのときは、自動的に再起動されます。

この例ではアンインストール時にも再起動を求めるダイアログが表示されますが、これを防ぐには、Conditionに「NOT REMOVE~="ALL"」を指定します。

これ以外の方法としては、REBOOTプロパティに「Force」を指定する方法もあります。例えば、MSIファイルをインストールするときに次のようなコマンドを使用し、プロパティを指定します。

msiexec /i (MSIファイル名) REBOOT=Force

-[[REBOOT Property>http://msdn.microsoft.com/library/en-us/msi/setup/reboot.asp]]

補足:Windows Installer 3.0以降では、「/forcerestart」コマンドラインオプションによっても可能です。

-[[Standard Installer Command-Line Options>http://msdn.microsoft.com/library/en-us/msi/setup/standard_installer_command_line_options.asp]]

再起動の確認ダイアログを表示しないで再起動されるようにするには、さらに「REBOOTPROMPT=Suppress」を追加します。

msiexec /i (MSIファイル名) REBOOT=Force REBOOTPROMPT=Suppress

-[[REBOOTPROMPT Property>http://msdn.microsoft.com/library/en-us/msi/setup/rebootprompt.asp]]

逆に再起動をしないようにするには、REBOOTプロパティを「ReallySuppress」とします(Windows Installer 3.0以降では、「/norestart」コマンドラインオプションによっても可能です)。

***インストール時にログファイルを作成する [#j2fb25b4]

インストーラが思ったとおりに機能しない場合には、ログファイルを作成すると役に立ちます。

msiexec.exeでは、「/l」コマンドラインオプションにより、ログファイルを作成することができます。「/l*vx」とすると、すべての情報がログに記録されます。

例えば、

msiexec /i Setup1.msi /l*vx logfile.txt

のようなコマンドでは、Setup1.msiをインストールする時にログをファイル「logfile.txt」に保存します。

-[[Command-Line Options>http://msdn.microsoft.com/library/en-us/msi/setup/command_line_options.asp]]

また、レジストリを書き換えることにより、Windows Installerのすべてのログをファイルに保存することもできます。レジストリの「HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer 
」に文字列の値「Logging」、値「voicewarmup」を追加することにより、一時フォルダに「Msi」で始まり「.log」で終わるファイル名のログファイルが作成されるようになります。詳しくは、次のリンク先をご覧ください。

-[[Windows インストーラのログの記録を有効にする方法>http://support.microsoft.com/kb/q223300/]]

***サイレントインストールを行う [#d2080d57]

ユーザーインターフェイスを表示しないサイレントインストールを行う方法は、第55号で紹介しました。つまり、「/qn」コマンドラインオプションを使用します。

msiexec /i Setup1.msi /qn

補足:Windows Installer 3.0以降では、「/quiet」コマンドラインオプションによっても可能です。

ちなみに、「/qb!」コマンドラインオプションにより、ユーザーインターフェイスの「キャンセル」ボタンを隠す(プログレスバーのみを表示する)ことができます。

//これより下は編集しないでください
#pageinfo(,2010-03-19 (金) 01:30:56,DOBON!,2010-03-19 (金) 01:30:56,DOBON!)

[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]