.NETアプリケーションをMSIファイルで配布する時、インストール先のコンピュータに.NET Frameworkがインストールされていなければ、これが先にインストールされるようにする方法を幾つか紹介します。
Visual Studio 2005、2008、2010では、非常に簡単です。セットアッププロジェクトを作成してビルドすれば、デフォルトの設定でもできてしまいます。
セットアッププロジェクトをビルドすると、MSIファイルの他に「setup.exe」という実行ファイルがMSIと同じフォルダにできます。この「setup.exe」を実行してインストールを開始すると、必要な.NET Frameworkがインストールされていない時は以下のようなダイアログが表示されて、必要なパッケージのダウンロードと、インストールが行われます。日本語 Language Packもインストールされるようです。
また、.NET Framework以外のコンポーネントもインストール可能です。Visual Studio 2010で事前インストールが可能なコンポーネントは、デフォルトでは、以下の通りです。
補足:事前インストール可能なコンポーネントは、独自に追加することもできます。その方法は、「ブートストラップ パッケージの作成」にあります。
事前インストールするコンポーネントを変更したり、コンポーネントをダウンロードする場所を変更するには、次のようにします。
この方法では、.NET Framework 1.1の事前インストールが可能です。
MSDNには、「.NET Framework 1.1 配布ガイド」と「.NET Framework アプリケーション配布ガイド」(.NET Framework 1.0の場合)や、「HOW TO: Visual Studio .NET デプロイメント プロジェクトの .NET Framework を配布します。」というページがあります。これらで紹介されている方法は、マイクロソフトが公開している「Microsoft .NET Framework version 1.1 Setup.exe Bootstrapper Sample」を使う方法です。(.NET Framework 1.0のBootstrapperはリンク先が見つからず、どこにあるのか分かりませんでした。)
以下にこの.NET Framework 1.1用のBootstrapperを使った場合の手順を簡単に紹介します。ここでは、インストールするMSIファイル(ここでは、「Setup1.msi」とする)と、「Microsoft .NET Framework Version 1.1 再頒布可能パッケージ」(dotnetfx.exe)、「Microsoft .NET Framework Version 1.1 日本語 Language Pack」(langpack.exe)はすでに用意されているものとします。
まず「Microsoft .NET Framework version 1.1 Setup.exe Bootstrapper Sample」から「NETFX1.1_bootstrapper.exe」をダウンロードし、書庫を展開します。すると、「setup.exe」と「settings.ini」の2つのファイルができます。
次に、settings.iniをテキストエディタで開き、適当な内容に変更します。最低限の設定は、次のようになります。
[Bootstrap] Msi=Setup1.msi [LangPacks] 1041
まず、[Bootstrap]の「Msi」でインストールするMSIファイルを指定します。また、[LangPacks]で日本語のLanguage Packのインストールを指定します(Language Packのインストールが必要なければ、省略できます)。
このsettings.iniとsetup.exe、及びSetup1.msi、dotnetfx.exe、langpack.exeを同じフォルダに入れてsetup.exeを実行させると、望みの動作が実現します。
setup.exeを実行すると、「Application Setup」というタイトルの「To start Application Setup, click OK. To quit without installing, click Cancel.」というダイアログが表示されます。settings.iniを編集することでこのメッセージを変更できます。また、エラーダイアログのタイトル(通常は「Application Setup Error」)も変更できます。次にこれらを変更した例を示します。なお、Shift JISで保存してください。
[Bootstrap] Msi=Setup1.msi ProductName=マイアプリ DialogText=「マイアプリ」のセットアップを開始するには「OK」を、インストールせずに終了するには「キャンセル」をクリックしてください。 CaptionText=マイアプリのセットアップ ErrorCaptionText =マイアプリセットアップエラー [LangPacks] 1041
ProductNameにはアプリケーションの名前を指定します。これは、DialogText、CaptionText、ErrorCaptionTextが指定されていない時に、「Application Setup」に代わって使われます。
DialogTextには初めに表示されるダイアログのメッセージを、CaptionTextにはそのタイトルを指定します。ErrorCaptionTextにはエラーダイアログのタイトルを指定します。(ただし、エラーメッセージは英語です。)
さらにMSIファイルとdotnetfx.exe及びlangpack.exeを別のフォルダに置きたい時は、[Bootstrap]の「FxInstallerPath」でdotnetfx.exeとlangpack.exeのあるフォルダのパスを指定します。このパスは、絶対パスまたは相対パスを指定できます。例えば、dotnetfx.exeとlangpack.exeを「dotnetfx」というフォルダに入れた場合は、次のようにします。
[Bootstrap] Msi=Setup1.msi ProductName=マイアプリ DialogText=「マイアプリ」のセットアップを開始するには「OK」を、インストールせずに終了するには「キャンセル」をクリックしてください。 CaptionText=マイアプリのセットアップ ErrorCaptionText =マイアプリセットアップエラー FxInstallerPath=dotnetfx [LangPacks] 1041
マイクロソフトでは、「Microsoft Visual Studio .NET 2003 Bootstrapper Plug-In」(ダウンロード)というプラグインを配布しています。これを使用して、.NET Framework 1.1とMDAC 2.7を配布するインストーラを作成できます。
このプラグインをインストール後、Visual Studioのセットアッププロジェクト(デプロイメントプロジェクト)のプロパティで「ブートストラップ」を「Windowsインストーラブートストラップ」としてからビルドすることにより、出力されたMSIファイルと同じフォルダに、Setup.exe、Settings.ini、Config.ini、dotnetfx.exe、langpack.exeの5つのファイルが作成されます。これらすべてのファイルを配布し、インストールする時はこのSetup.exeを実行するようにすればよいわけです。
このプラグインはヘルプもなく、説明がほとんどないため、使用法がよく分かりません。よって、ここでの説明はあくまで推測でしかないことをご了承ください。
まず、ダイアログに表示されるメッセージを変更するには、Config.iniを編集するようです。また、MSIファイルのパス、dotnetfx.exeのパス、langpack.exeのパスをSettings.iniで指定できるようです。
さて、MDACに関しては、このままではインストールされません(必要に応じてMDACがインストールされる設定になるという報告もあるようですが、確認できませんでした)。MDACをインストールする時は、Settings.iniの「MdacVersion」にMDACのバージョンを設定し、「BootstrapMdac」をtrueにしてから、Setup.exeと同じフォルダにmdac_typ.exeをコピーします(mdac_typ.exeは、「<Program Filesフォルダ>\Microsoft Visual Studio .NET 2003 Bootstrapper Plug-in\1041」にあります)。
この方法は、.NET Framework 1.0と1.1に対応しています。
.NET Frameworkには、Internet Explore 5.01以上がインストールされていることが必要です。「.NET Framework 1.1 再配布可能パッケージの必要条件」によると、Windows NT 4.0と98にはIE4.01が、Windows 98 SEにはIE5.00があらかじめインストールされているため、これらのOSでは5.01以降のIEをインストールする必要があるかもしれません。
「Enhanced .NET Bootstrap Setup」では、.NET Framework、Language Pack、MDACの他に、IE 6.01とWindows Installerもインストールできるブートストラップが公開されています。
設定は、「settings.ini」で行います。settings.iniの書き方については上記リンク先で説明されていますが、以下に簡単に説明します。
設定 | 説明 |
---|---|
Msi | インストールするMSIファイルのパスを指定します。 |
ProductName | 製品名を指定します。 |
FxInstallerPath | Dotnetfx.exeのあるフォルダのパスを指定します。 |
IEInstallerPath | IE 6.01パッケージ(ie6setup.exe)のあるフォルダのパスを指定します。 |
MSIInstallerPath | Windows Installer 2.0パッケージ(InstMsiW.exeとInstMsiA.exe)のあるフォルダのパスを指定します。 |
MDACInstallerPath | mdac_typ.exeのあるフォルダのパスを指定します。 |
MDACVersion | MDACのバージョンを指定します。 |
.NetVersion | .NET Frameworkのバージョン(「v1.0」か「v1.1」)を指定します。 |
MSDEInstallerPath | MSDE(SQL Server 2000 Desktop Engine)インストーラ(setup.exe)のあるフォルダのパスを指定します。 |
MSDEParams | MSDEパラメータを指定します。 |
この他に「LanguageDirectory」も使われているようで、「<Windowsディレクトリ>\Microsoft.NET\(.NET Frameworkのバージョン)\(「LanguageDirectory」で指定された文字列)」というフォルダを探し、なければ.NET Frameworkをインストールするという処理をしているようです。(サンプルでは、「LanguageDirectory=jpn」となっていますが、少なくとも私の環境では、「jpn」ではなく「JA」のようです。)
この「Enhanced .NET Bootstrap Setup」ですが、私の環境で試した限りでは、正常に動作しませんでした。
まず、.NET Frameworkがインストールされていても、「Could not find the .Net Version Number in the registry」というエラーがでて、.NET Frameworkをインストールするように指定します。どうやらこのBootstrapでは、dotnetfx.exeのファイルバージョンのビルド番号をこれがインストールする.NET Frameworkのビルド番号と判断して、レジストリの「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\(「.NetVersion」の値)」にこのビルド番号と同じ値が存在しているか調べ、なければ.NET Frameworkをインストールするようにしているようですが、そのビルド番号が正しく取得できていないため、正しく判断できていないようです。
また、Windows Installerのインストールの判断も正しくないようです。インストールされているWindows Installerのバージョンがきっちり2であるか調べ、そうでなければWindows Installerをインストールするようにしているようで、バージョン3がインストールされていても、Windows Installerをインストールしようとします。(それ以前の問題として、「.NET Framework再頒布可能パッケージの中身を見てみる」で紹介したように、そもそもWindows Installer 2.0をインストールする必要があるかも疑問です。)
「Enhanced .NET Bootstrap Setup」はソースが公開されているため、修正は可能でしょう。(メッセージは英語ですが、リソースを書き換えることにより、日本語表示できそうです。)
注意:この記事は古いバージョンのdotNetInstallerについて書かれているため、新しいバージョンとは違っている箇所があるかもしれないことをご了承ください。
ここまでいろいろなBootstrapを紹介してきましたが、これらはすべてすでに決められたパッケージを、すでに決められた条件で判断してインストールするというものでした。
最後に紹介する「dotNetInstaller Setup Bootstrapper」では、インストールするパッケージと、インストールする条件を自由にカスタマイズすることができます。よって、.NET FrameworkやMDACだけでなく、NT4のSP6aや、J#の再頒布可能パッケージのインストールも指定できます。
dotNetInstallerでは、まずInstaller Editorにより設定ファイル(XMLファイル)を作成する必要があります。設定ファイルは、同梱されている「StandaloneSetup」のサンプルが参考になります。サンプルにはイタリア語の「Setup Configuration」がありますが、まずはこれを日本語(LCID=1041)に変更して使用するとよいでしょう。
dotNetInstallerのBootstrapperを実行するには、dotNetInstaller.exeと同じフォルダに設定ファイル「configuration.xml」と、バナーに使用する画像、unicows.dllを入れ、さらに設定で指定された場所にパッケージを用意した状態で、dotNetInstaller.exeを実行します。Installer Editorのメニュー「File」の「Create Exe」によりExeファイルを作成したときは、そのExeファイルに設定とバナーが埋め込まれますので、設定ファイルとバナー画像は必要なくなります。
設定の書き方について、もう少し補足しておきましょう。
サンプルのイタリア語のSetup Configurationでは、.NET Framework 1.1のインストールは行っていますが、Language Packのインストールは行っていないようです。そこで試しに、.NET Frameworkの日本語Language Packをインストールする設定を加えることにしましょう。(ここでは、LCIDが1041のSetup Configurationがあるものとします。)
まず「install:1041」の項目を右クリックし、「Add」から「Command Component」を選択します。作成された「Command Component」の設定は、
とします。
次にこのCommand Componentが実行される条件を指定します。日本語Language Packがインストールされているか調べる方法については、「.NET Framework 1.1 の再配布」で説明されています。これによると、レジストリの「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322\1041」に「Install(DWORD value = 1)」という値があれば、すでにインストールされていると判断できるようです。
上記で作成したCommand Component項目を右クリックし、「Add」の「Installed Check Registry」を選択します。そして、次のように項目を埋めます。
これで日本語Language Packがインストールされていない時にインストールされる設定が追加されました。
ただ問題は、その位置です。今の状態では、アプリケーションのMSIファイルの後にLanguage Packがインストールされることになります。Command Componentの位置を変更するのは、Installer Editorでは無理のようです。よって、設定ファイルをテキストエディタで開き、手作業で修正する必要があります(メニューの「File」-「Edit With Notepad」により、メモ帳で開くことができます)。
同様の方法で、J#の再頒布可能パッケージとLanguage Packをインストールする設定も追加することができます。これらがインストールされているか調べる方法も、「.NET Framework 1.1 の再配布」で説明されています。
参考までに、以上のように作成した設定を、こちらに置いておきます。いい加減なものですので、参考だけにしてください。(間違い等を指摘していただけると、助かります。)
dotNetInstallerの凄い所はこれだけではありません。dotNetInstallerでは、必要なパッケージをインターネットからダウンロードしてインストールすることもできるのです。さらに、bootstrapperのみをWebに公開し、残りのすべてのファイルは必要に応じてダウンロードしてインストールするということまでできてしまいます。この方法に関しては、dotNetInstallerのサイトの「How to create a Web Setup to install .NET Framework and your msi setup」(リンク切れ)をご覧ください。
ただし、私が試したところでは、ダウンロードしたファイルはインストール終了後も削除されないようです。
ここで紹介したbootstrapperは、ユーザーがEXEファイルを無視して、MSIファイルを直接実行してしまったら全く意味がありません。これを防ぐには、すべてのファイルを自己展開書庫にまとめ、この自己展開書庫を実行した時に自動的にbootstrapperを実行するようにする方法があります。このような書庫を作成するのに適したアーカイバについては、「おまけのアーカイバ選び」をご覧ください。
また、MSIファイルが直接実行されたとしても、必要なソフトウェアがコンピュータにインストールされていなければ実行できないように、適当な起動条件を追加したほうがよいかもしれません。例えば、MDAC 2.6以降がインストールされていることを起動条件とする方法に関しては、こちらをご覧ください。
(この記事は、「.NETプログラミング研究」の第55号で紹介したものを基にしています。)