下面是我如何在我的包中检测 .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's 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's 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 也有一个缺点。假设您安装了 .NET 4.0,并且您的托管引导程序需要 .NET 4.0(或更高版本)。当您运行安装程序时,它将安装替换 .NET 4.0 的 .NET 4.5,强制安装程序在中途重新启动,因为它在更新的同时使用 .NET 框架。同样,如果您使用自己的自定义托管引导程序,这只是一个问题。