.NETプログラミング研究 第55号 †.NET Tips †.NET Framework再頒布可能パッケージの中身を見てみる †これはTipというより、「解剖」という感じでしょうか。 .NET Framework再頒布可能パッケージはVersion 1.0が「dotnetredist.exe」、1.1が「dotnetfx.exe」というファイル名でマイクロソフトのサイトからダウンロードできます。 これらのファイルはCabの自己展開書庫ですので、アーカイバで展開することができます。実際に展開してみると、次のようなファイルが作成されます。 ・.NET Framework 1.1再頒布可能パッケージ(dotnetfx.exe)を展開した時に作成されるファイル ファイル名 サイズ(バイト) 製品バージョン install.exe 98,304 1.1.4322.573 InstMsi.exe 1,707,856 2.0.2600.1 InstMsiW.exe 1,821,008 2.0.2600.0 netfx.msi 5,942,272 - netfx1.cab 14,638,532 - ・.NET Framework 1.0再頒布可能パッケージ(dotnetredist.exe)を展開した時に作成されるファイル ファイル名 サイズ(バイト) 製品バージョン dotnetfx.exe 22,702,664 1.0.3705.15 ・dotnetredist.exe内のdotnetfx.exeを展開した時に作成されるファイル ファイル名 サイズ(バイト) 製品バージョン install.exe 98,304 1.0.3705.0 InstMsi.exe 1,707,856 2.0.2600.1 InstMsiW.exe 1,821,008 2.0.2600.0 netfx.msi 5,245,952 - netfx1.cab 13,754,653 - この内、InstMsi.exeとInstMsiW.exeはWindows Installer 2.0再頒布可能パッケージです。よって、dotnetfx.exeにはWindows Installer 2.0再頒布可能パッケージが含まれていることが分かります。(現在マイクロソフトからダウンロードできるWindows Installer 2.0 Redistributableファイルの製品バージョンは2.0.2600.2ですので、同じではありません。)
dotnetfx.exeを実行すると、ファイルを展開し、install.exeを実行します。install.exeはコンピュータにWindows Installer 2.0以上がインストールされているか調べ、されていなければ、InstMsi.exeまたはInstMsiW.exeにより、Windows Installer 2.0をインストールします。その後、netfx.msiを実行して.NET Frameworkをインストールします。 以上から、.NET FrameworkはMSIファイルによりインストールされ、またdotnetfx.exeとWindows Installer 2.0以前の再頒布可能パッケージを同時に配布するのは意味がないということが分かります。 参考: dotnetfx.exeのコマンドラインオプションを調べる †MSDNの「.NET Framework 1.1 の再配布」によると、Dotnetfx.exeのサイレントインストールは、 dotnetfx.exe /q:a /c:"install /l /q" というコマンドで実行されるとのことです。 このコマンドの意味するところは何なのでしょうか?まず、「dotnetfx.exe /?」コマンドにより、dotnetfx.exeのコマンドラインオプションを調べてみます。その結果、次のような説明が表示されました。 /Q パッケージ処理の状況を一部表示しないモード /T:<完全なパス> 一時フォルダを指定 /C /Tと同時に指定した場合に、指定したフォルダのみにファイルを展開 /C:<Cmd> 指定したインストールコマンドを無視 つまり、「/Q」はサイレントモードを指定し、「/T」と「/C」では「/T」で指定したフォルダにファイルを展開し、「/C:<Cmd>」では展開後に実行するコマンドを指定(製作者により指定されたインストールコマンドを上書き)できるようです。 しかしこれでは上記の「/q:a /c:"install /l /q"」というコマンドラインの「/q:a」が何を意味するかは分かりません。実はdotnetfx.exeのコマンドラインオプションはこれだけではありません。 dotnetfx.exeのプロパティを表示すると、「説明」が「IExpress Setup」となっていることが分かります。つまりこのパッケージの作成には、IExpressが使われているのです。(dotnetredist.exeなどは「説明」が「Win32 キャビネット自己展開ツール」と表示されますが、これもIExpressで作成されたことを意味します。)IExpressとはWindows 2000、Windows XPにインストールされているCab書庫を作成するためのツールで、詳しくは、DOBON.NETの「VBに適したインストーラを探そう」などをご覧ください。 IExpressパッケージに使用できるコマンドラインオプションについては、サポート技術情報の「IExpress ソフトウェア更新プログラム パッケージのコマンド ライン スイッチ」で説明されています。 ここで説明されているコマンドラインオプションを以下に引用させていただきます。
これでようやくすべての意味が分かりました。「/q:a /c:"install /l /q"」は、管理者非表示モードで実行し、展開後「install /l /q」というコマンドを実行するという意味だということが分かります。 ところで、「install /l /q」の意味はなんでしょうか?早速「install /?」でinstall.exeのコマンドラインオプションを調べてみました。 /? または /h このダイアログ(使い方ダイアログ) /u アンインストール /l 一時ディレクトリにnetfx.logを作成する これまた「/q」に対する説明に欠けていますが、これに関しては「.NET Framework Version 1.1 再配布可能パッケージ テクニカル リファレンス」で説明されています。 その説明を以下に引用させていただきます。
つまり「install /l /q」では、一時フォルダにログを作成し、無人インストールモードを指定していることが分かります。 これでようやくすっきりしましたね。 補足: .NET FrameworkのLanguage Pack、langpack.exeも「IExpress Setup」ですが、内蔵されているbootstrapperは「Install.exe」ではなく、「inst.exe」です。「inst.exe /?」により表示されるオプションの説明は、次のようなものです。 /? または /h このダイアログ(使い方ダイアログ) /q UIを使用しない無人インストール /qb プログレスバーを使用する無人セットアップ /u アンインストール /l 一時ディレクトリにログを作成する Install.exeとinst.exeは非常に似ているため、Install.exeでも/qbオプションが使えるかもしれません。(未確認) 参考: インストール前に.NET Frameworkをインストールする †.NETアプリケーションをMSIファイルで配布する時、インストール先のコンピュータに.NET Frameworkがインストールされていなければ、これが先にインストールされるようにする方法を紹介します。 「Microsoft .NET Framework version 1.1 Setup.exe Bootstrapper Sample」を使った方法 †まず、MSDNの「.NET Framework 1.1 配布ガイド」と「.NET Framework アプリケーション配布ガイド」(.NET Framework 1.0の場合)でその方法が説明されています。
ここで紹介されている方法は、マイクロソフトが公開している「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で保存してください。
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を配布するインストーラを作成できます。
このプラグインをインストール後、VS.NETのデプロイメントプロジェクトのプロパティで「ブートストラップ」を「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には、Internet Explore 5.01以上がインストールされていることが必要です。「.NET Framework 1.1 再配布可能パッケージの必要条件」によると、Windows NT 4.0と98にはIE4.01が、Windows 98 SEにはIE5.00があらかじめインストールされているため、これらのOSでは5.01以降のIEをインストールする必要があるかもしれません。 「The Code Project」の「Enhanced .NET Bootstrap Setup」では、.NET Framework、Language Pack、MDACの他に、IE 6.01とWindows Installerもインストールできるブートストラップが公開されています。 設定は、「settings.ini」で行います。settings.iniの書き方については上記URLで説明されていますが、以下に簡単に説明します。
この他に「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」を使用した方法 †ここまでいろいろなBootstrapを紹介してきましたが、これらはすべてすでに決められたパッケージを、すでに決められた条件で判断してインストールするというものでした。 最後に紹介する「dotNetInstaller - Setup Bootstrapper for .NET Application」では、インストールするパッケージと、インストールする条件を自由にカスタマイズすることができます。よって、.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のインストールは行っていますが、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」を選択します。そして、次のように項目を埋めます。 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 の再配布」で説明されています。 参考までに、以上のように作成した設定を、日本語のSetup Configurationの部分のみ、以下に示します。(一行が長いため、途中で改行しています。)いい加減なものですので、参考だけにしてください。
dotNetInstallerの凄い所はこれだけではありません。dotNetInstallerでは、必要なパッケージをインターネットからダウンロードしてインストールすることもできるのです。さらに、bootstrapperのみをWebに公開し、残りのすべてのファイルは必要に応じてダウンロードしてインストールするということまでできてしまいます。この方法に関しては、dotNetInstallerのサイトの「How to create a Web Setup to install .NET Framework and your msi setup」をご覧ください。 ただし、私が試したところでは、ダウンロードしたファイルはインストール終了後も削除されないようです。 最後に †ここで紹介したbootstrapperは、ユーザーがEXEファイルを無視して、MSIファイルを直接実行してしまったら全く意味がありません。これを防ぐには、すべてのファイルを自己展開書庫にまとめ、この自己展開書庫を実行した時に自動的にbootstrapperを実行するようにする方法があります。このような書庫を作成するのに適したアーカイバについては、DOBON.NETの「おまけのアーカイバ選び」をご覧ください。 また、MSIファイルが直接実行されたとしても、必要なソフトウェアがコンピュータにインストールされていなければ実行できないように、適当な起動条件を追加したほうがよいかもしれません。例えば、MDAC 2.6以降がインストールされていることを起動条件とする方法に関しては、「Visual Studio .NET 2003 による .NET Framework の再配布」で紹介されています。
|