如何使用WiX Burn智能安装.NET 4.x

18

当安装一个能够使用.NET 4.0或4.5的应用程序时,安装.NET Framework先决条件的最佳实践是什么?并且如何使用WiX中的Burn来实现它?

以下是我知道的选项和折衷方案:

选项1: 只安装.NET 4.0(刚好满足需求)

  • 优点:没有已知优点(除了Windows XP,它只有这个选择)。

选项2: 如果不存在.NET 4.5,则安装.NET 4.5

  • 优点:用户不必为未来的应用程序再次安装.NET 4.5。应用程序在用户稍后升级到.NET 4.5时不会遇到.NET版本更改。应用程序立即获得.NET 4.5的性能提高。

选项3: 仅在不存在.NET 4.x时安装.NET 4.5

  • 优点:如果.NET 4.0已经安装,则部署比选项2快得多。否则,选项2的优点适用。

据我所知,如果性能提高很重要,则最佳实践应该是选项2;如果平均部署速度很重要,则是选项3。这听起来正确吗?我是否忽略了选项1的优点?最重要的是,如果选项3有意义,如何在从Web安装.NET时使用Burn实现它?

1个回答

24

以下是我如何在我的捆绑包中检测.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=&quot;4.5.50709&quot;) AND (NOT VersionNT64 OR (Netfx4x64FullVersion=&quot;4.5.50709&quot;))"
              InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion=&quot;4.5.50709&quot; OR Netfx4x64FullVersion=&quot;4.5.50709&quot;))"/>
</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 &lt; v6.0 OR VersionNT64 &lt; 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,我就不会安装它。

此外,如果你使用自定义托管引导程序应用程序,Option 2也有一个缺点。假设你已经安装了.NET 4.0,而你的托管引导程序需要.NET 4.0(或更高版本)。当你运行安装程序时,它将安装.NET 4.5,代替.NET 4.0,强制您的安装程序在中途重新启动,因为它在更新时同时使用.NET框架。再次强调,只有当您使用自己的自定义托管引导程序才会出现这个问题。


1
在我的情况下,我想通过WixNetfxExtension的NetFx45Web软件包组使用网络安装程序。我相应地更新了问题。在使用内置软件包组时,是否有与InstallCondition相当的内容? - Edward Brey
InstallConditions 在包本身上(ExePackage,MsiPackage)。此外,当前的 WiX 手册中没有列出任何 .NET 4.5 属性来告诉是否已安装。我认为这些限制是我没有在我的设置中使用 NetfxExtension 的原因。我认为,如果您想使用 NetfxExtension 安装 .NET 4.5,则可能只需添加 NetFx45Web 包组,然后在安装上放置一个条件,仅在 Vista 或更高版本上运行。然后,如果您需要 XP 安装,请创建一个单独的项目或配置来生成单独的安装程序。 - BryanJ
有没有一种不太困难的方法可以在没有NetfxExtension的情况下进行.NET的Web安装? - Edward Brey
1
是的。请调用 Web 安装程序而不是完整的 .NET 安装程序。您可以从此处下载:http://msdn.microsoft.com/zh-cn/library/5a4x27ek.aspx - BryanJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接