Ответ 1
Ниже показано, как я обнаруживаю .NET в своем пакете. Обратите внимание на использование DetectConditions и InstallConditions. DetectCondition будет проверять, установлен ли конкретный пакет, а InstallCondition может использоваться для переопределения DetectCondition, чтобы указать, когда пакет должен быть установлен. Например, на XP вы не можете установить .NET 4.5, поэтому мой InstallCondition предотвращает установку в таком случае.
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version" Variable="Netfx4FullVersion" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version" Variable="Netfx4x64FullVersion" Win64="yes" />
<!-- .NET 4.5 only installed if Vista or higher AND it not already installed-->
<PackageGroup Id="Netfx45">
<ExePackage Id="Netfx45" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" InstallCommand="/q"
SourceFile="C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX45Full\dotnetfx45_full_x86_x64.exe"
DetectCondition="(Netfx4FullVersion="4.5.50709") AND (NOT VersionNT64 OR (Netfx4x64FullVersion="4.5.50709"))"
InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion="4.5.50709" OR Netfx4x64FullVersion="4.5.50709"))"/>
</PackageGroup>
<!-- .NET 4.0 only installed if XP AND it not already installed -->
<PackageGroup Id="Netfx4Full">
<ExePackage Id="Netfx4Full" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" InstallCommand="/q"
SourceFile="C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe"
DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)"
InstallCondition="(VersionNT < v6.0 OR VersionNT64 < v6.0) AND (NOT (Netfx4FullVersion OR Netfx4x64FullVersion))"/>
</PackageGroup>
Затем, если вы хотите установить один из пакетов, просто укажите его в своей цепочке:
<Chain>
<PackageGroupRef Id='Netfx45'/>
</Chain>
Что касается вашего конкретного вопроса, я бы установил любую версию фреймворка, с которым было проверено приложение. Если он протестирован как на .NET 4.0, так и на .NET 4.5, я полагаю, что это решение, однако я попытался бы максимально упростить настройку. Поэтому, если .NET 4.0 уже был установлен и приложение не требует .NET 4.5, я бы не установил его.
Кроме того, есть недостаток в Варианте 2, если вы используете собственное приложение Managed Bootstrapper. Скажем, у вас установлен .NET 4.0, а для управляемого загрузочного загрузчика требуется .NET 4.0 (или выше). Когда вы запустите установщик, он установит .NET 4.5, который заменит .NET 4.0, заставив ваш установщик перезагрузиться на полпути, потому что он использовал .NET framework в то же время, когда он обновлялся. Опять же, это только проблема, если вы используете собственный собственный управляемый загрузчик.