DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

インストール前に.NET Frameworkをインストールする

.NETアプリケーションをMSIファイルで配布する時、インストール先のコンピュータに.NET Frameworkがインストールされていなければ、これが先にインストールされるようにする方法を幾つか紹介します。

Visual Studio 2005、2008、2010を使った方法

Visual Studio 2005、2008、2010では、非常に簡単です。セットアッププロジェクトを作成してビルドすれば、デフォルトの設定でもできてしまいます。

セットアッププロジェクトをビルドすると、MSIファイルの他に「setup.exe」という実行ファイルがMSIと同じフォルダにできます。この「setup.exe」を実行してインストールを開始すると、必要な.NET Frameworkがインストールされていない時は以下のようなダイアログが表示されて、必要なパッケージのダウンロードと、インストールが行われます。日本語 Language Packもインストールされるようです。

コンポーネントのセットアップ

また、.NET Framework以外のコンポーネントもインストール可能です。Visual Studio 2010で事前インストールが可能なコンポーネントは、デフォルトでは、以下の通りです。

  • .NET Framework 3.5 SP1
  • .NET Framework 3.5 SP1 Client Profile
  • Microsoft .NET Framework 4 (x86 および x64)
  • Microsoft .NET Framework 4 Client Profile (x86 および x64)
  • Microsoft Office 2007 プライマリ相互運用機能アセンブリ
  • Microsoft Visual Basic PowerPacks 10.0
  • Microsoft Visual F# Runtime for .NET 2.0
  • Microsoft Visual F# Runtime for .NET 4.0
  • Microsoft Visual Studio 2010 Report Viewer
  • Microsoft Visual Studio 2010 Tools for Office Runtime (x86 および x64) Language Pack - 日本語
  • SQL Server 2005 Express Edition SP2 (x86)
  • SQL Server 2008 Express Edition
  • SQL Server Compact 3.5 SP2
  • Visual C++ 2010 ランタイム ライブラリ (IA64)
  • Visual C++ 2010 ランタイム ライブラリ (x64)
  • Visual C++ 2010 ランタイム ライブラリ (x86)
  • Windows インストーラ (3.1)
  • Windows インストーラ (4.5)
補足:事前インストール可能なコンポーネントは、独自に追加することもできます。その方法は、「ブートストラップ パッケージの作成」にあります。

事前インストールするコンポーネントを変更したり、コンポーネントをダウンロードする場所を変更するには、次のようにします。

  1. ソリューションエクスプローラでセットアッププロジェクトを右クリックし、表示されるメニューから「プロパティ」を選択し、「(プロジェクト名)プロパティページ」ダイアログを表示します。
  2. 「必須コンポーネント」ボタンをクリックして、下図のような「必須コンポーネント」ダイアログを表示します。
    「必須コンポーネント」ダイアログ
  3. 「必須コンポーネントをインストールするセットアッププログラムを作成する」にチェックを入れると、setup.exeが作成されます。また「インストールする必須コンポーネントを選択する」で事前インストールを行うコンポーネントを選択します。
  4. 「必須コンポーネントのインストール場所を指定してください」で「必須コンポーネントをコンポーネントの開発元の Web サイトからダウンロードする」を選択すると、マイクロソフトのサイトからコンポーネントがダウンロードされます。
    コンポーネントをダウンロードするのではなく、MSIファイルと一緒に配布するには、「アプリケーションと同じ場所から必須コンポーネントをダウンロードする」を選択します。これにより、ビルドすると、MSIファイルと同じフォルダにコンポーネントのフォルダが作成され、その中に必要なファイルがコピーされるようになります。
    「次の場所から必須コンポーネントをダウンロードする」を選択すると、コンポーネントのある場所を任意に指定することができます。

「Microsoft .NET Framework version 1.1 Setup.exe Bootstrapper Sample」を使った方法

この方法では、.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」でインストールする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で保存してください。

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」というフォルダに入れた場合は、次のようにします。

「Microsoft Visual Studio .NET 2003 Bootstrapper Plug-In」を使用した方法

マイクロソフトでは、「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」にあります)。

「Enhanced .NET Bootstrap Setup」を使用した方法

この方法は、.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 - Setup Bootstrapper for .NET Application」を使用した方法

注意:この記事は古いバージョンの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
"#APPPATH\SupportFiles\dotNet1.1\Japanese\LangPack.exe" /q:a /c:"inst /l /q"
description
Microsoft .NET Framework Version 1.1 日本語 Language Pack
note
日本語 - Standard - .NET Framework Version 1.1 日本語 Language Pack

とします。

次にこの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」を選択します。そして、次のように項目を埋めます。

comparison
match
fieldname
Install
fieldtype
REG_DWORD
fieldvalue
1
path
SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322\1041

これで日本語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以降がインストールされていることを起動条件とする方法に関しては、こちらをご覧ください。

  • 履歴:
  • 2007/1/15 Visual Studio 2005を使った方法を追加。
  • 2013/5/8 数箇所を新しい情報に書き直す。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • Windows Vista以降でUACが有効になっていると、レジストリへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。