.NET Framework 4.6.2 用のブートストラップ (setup.exe) の問題

こんにちは、Visual Studio サポートチームです。
今回は、.NET Framework 4.6.2 を必須コンポーネントに含むブートストラップ (Setup.exe) を作成する際に生じる問題と、その対処方法についてご案内します。

 

.NET Framework 4.6.2 用ブートストラップ パッケージ

開発したアプリケーションを .NET Framework 4.6.2 とともに配布するため、.NET Framework 4.6.2 を必須コンポーネントとして含めたブートストラップ (setup.exe) を作成したいことがあります。

そのようなブートストラップを開発するためには、.NET Framework 4.6.2 用のブートストラップ パッケージを使用します。

.NET Framework 4.6.2 用のブートストラップ パッケージは、.NET Framework 4.6.2 Developer Pack に含まれており、Developer Packは、以下のダウンロードサイトから入手することができます。

 

Windows 7 SP1、Windows 8.1、Windows 10、Windows Server 2008 R2 SP1、Windows Server 2012、Windows Server 2012 R2 用の Microsoft .NET Framework 4.6.2 Developer Pack および Language Pack
https://www.microsoft.com/ja-jp/download/details.aspx?id=53321


現象

.NET Framework 4.6.2 を必須コンポーネントとしたブートストラップ をWindows 10 バージョン 1607 (Anniversary update) 上で実行した場合、同バージョンの Windows 10 には OS のコンポーネントとして、既に .NET Framework 4.6.2 がインストールされているにもかかわらず、.NET Framework 4.6.2 のインストールがスキップされずに実行されます。

 

原因

この現象は、.NET Framework 4.6.2 用のブートストラップ パッケージに含まれる Product.xmlならびにPackage.xml に定義されたインストール要否の判定のための定数値 (Release DWORD の値) が、Windows 10 バージョン 1607 に同梱されている .NET Framework 4.6.2 のバージョンの値よりも高い値となっているために発生します。

.NET Framework 4.6.2のRelease DWORD の値は、Windows 10 バージョン 1607に同梱されるパッケージとそれ以外のOSに対するパッケージとで異なる値が設定されています。

 

バージョン

Release DWORD の値

Windows 10 Anniversary Updateに同梱される .NET Framework 4.6.2

394802
その他のWindows OS バージョンにインストールされた .NET Framework 4.6.2

394806

 

これに対し、.NET Framework 4.6.2 用のブートストラップ パッケージに含まれる Product.xml ならびに Package.xmlでは、インストール要否判定のための Release DWORD の閾値として394806 が定義されています。
インストール要否の判定では、ブートストラップ パッケージに定義された Release DWORD の値と、対象の環境にインストール済みのバージョンの値を比較し、ブートストラップ パッケージの値の方が大きい場合にのみインストールを実行し、それ以外ではインストールをスキップします。
Windows 10 バージョン 1607に同梱される .NET Framework 4.6.2 の Release DWORD の値は394802であり、ブートストラップ パッケージに定義されている 394806より低いため、スキップされずにインストールが実行されます。

 

対処策

Product.xml ならびに Package.xml のインストール要否の判定ロジックで使用されている Release DWORD の値を Windows 10 バージョン 1607 に同梱される .NET Framework 4.6.2 に対する値 "394802" に変更し、ブートストラップを作成します。

 

変更手順:

1) Product.xml、Package.xmlのバックアップを作成しておきます。

    各ファイルは既定で以下の場所に配置されます。

     Product.xml : <インストール ルート>\Bootstrapper\Packages\DotNetFX462\
     Package.xml : <インストール ルート>\Bootstrapper\Packages\DotNetFX462\ja\

 

 2) メモ帳等で各xmlファイルを開き、以下の箇所を変更してファイルを保存します。

Product.xml

変更前

<Command PackageFile="NDP462-KB3151800-x86-x64-AllOS-ENU.exe" Arguments=" /q /norestart /ChainingPackage FullX64Bootstrapper" EstimatedInstalledBytes="437362964" EstimatedInstallSeconds="600" EstimatedTempBytes="2095870765">      <!-- These checks determine whether the package is to be installed -->      <InstallConditions>        <!-- This command is only for Samesite -->        <BypassIf Property="InstallMode" Compare="ValueEqualTo" Value="HomeSite" />        <!-- This indicates .NET Framework Full is already installed -->        <BypassIf Property="DotNet462Full_Release" Compare="ValueGreaterThanOrEqualTo" Value="394806" />

 

変更後

<Command PackageFile="NDP462-KB3151800-x86-x64-AllOS-ENU.exe" Arguments=" /q /norestart /ChainingPackage FullX64Bootstrapper" EstimatedInstalledBytes="437362964" EstimatedInstallSeconds="600" EstimatedTempBytes="2095870765">      <!-- These checks determine whether the package is to be installed -->      <InstallConditions>        <!-- This command is only for Samesite -->        <BypassIf Property="InstallMode" Compare="ValueEqualTo" Value="HomeSite" />        <!-- This indicates .NET Framework Full is already installed -->        <BypassIf Property="DotNet462Full_Release" Compare="ValueGreaterThanOrEqualTo" Value="394802" />

 

 

 

変更前

<Command PackageFile="NDP462-KB3151802-Web.exe" Arguments=" /q /norestart /ChainingPackage FullX64Bootstrapper /lcid 1033" EstimatedInstalledBytes="437362964" EstimatedInstallSeconds="600" EstimatedTempBytes="468232836">      <!-- These checks determine whether the package is to be installed -->      <InstallConditions>        <!-- This command is only for Samesite -->        <BypassIf Property="InstallMode" Compare="ValueNotEqualTo" Value="HomeSite" />        <!-- This indicates .NET Framework Full is already installed -->        <BypassIf Property="DotNet462Full_Release" Compare="ValueGreaterThanOrEqualTo" Value="394806" />

 

変更後

<Command PackageFile="NDP462-KB3151802-Web.exe" Arguments=" /q /norestart /ChainingPackage FullX64Bootstrapper /lcid 1033" EstimatedInstalledBytes="437362964" EstimatedInstallSeconds="600" EstimatedTempBytes="468232836">      <!-- These checks determine whether the package is to be installed -->      <InstallConditions>        <!-- This command is only for Samesite -->        <BypassIf Property="InstallMode" Compare="ValueNotEqualTo" Value="HomeSite" />        <!-- This indicates .NET Framework Full is already installed -->        <BypassIf Property="DotNet462Full_Release" Compare="ValueGreaterThanOrEqualTo" Value="394802" />

Package.xml

変更前 

<!-- These checks determine whether the package is to be installed in the cases where .NET is integrated into the OS -->  <InstallConditions>    <!-- This indicates .NET Framework is already installed -->        <BypassIf Property="DotNet462FullLangPack_Release" Compare="ValueGreaterThanOrEqualTo" Value="394806" />

 

変更後

<!-- These checks determine whether the package is to be installed in the cases where .NET is integrated into the OS -->      <InstallConditions>        <!-- This indicates .NET Framework is already installed -->        <BypassIf Property="DotNet462FullLangPack_Release" Compare="ValueGreaterThanOrEqualTo" Value="394802" />

 

3)ブートストラップを作成します。

 

 

弊社製品の不具合でご迷惑をおかけし誠に申し訳ありません。Windows 10 バージョン 1607 に同梱された .NET Framework 4.6.2に対応したブートストラップを作成する場合は上記の対処方法をご利用ください。

 

  • ご参考情報

.NET Framework の各バージョンのインストール判定の値については以下のMSDNドキュメントをご参照ください。

How to: Determine Which .NET Framework Versions Are Installed
https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx