【问题标题】:How to intelligently install .NET 4.x using WiX Burn如何使用 WiX Burn 智能安装 .NET 4.x
【发布时间】:2012-10-30 04:17:02
【问题描述】:

安装可使用 .NET 4.0 或 4.5 的应用程序时,安装必备 .NET 框架时的最佳做法是什么?以及如何在 WiX 中使用 Burn 来实现它?

这些是我知道的选项和权衡:

选项 1:安装 .NET 4.0(正是您所需要的)

  • 优势:未知(Windows XP 除外,这是唯一的选择)

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

  • 优点:用户以后不必再安装 .NET 4.5 应用。当用户稍后进行时,应用程序不会遇到 .NET 版本更改 升级到 .NET 4.5。应用程序立即获得性能改进 .NET 4.5。

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

  • 优点:如果 .NET 4.0 是,则部署速度比选项 2 快得多 已安装。如果不是,那么选项 2 的优点 申请。

据我所知,如果性能改进很重要,最佳做法是选项 2,如果平均部署速度很重要,最佳做法是选项 3。这听起来对吗?我错过了选项 1 的任何优势吗?最重要的是,如果选项 3 确实有意义,那么在从 Web 安装 .NET 时如何使用 Burn 来实现它?

【问题讨论】:

    标签: wix windows-installer wix3.6 bootstrapping burn


    【解决方案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'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,我不会安装它。

    此外,如果您使用的是自定义托管引导程序应用程序,则选项 2 有一个缺点。假设您安装了 .NET 4.0,并且您的托管引导程序需要 .NET 4.0(或更高版本)。当您运行安装程序时,它将安装替换 .NET 4.0 的 .NET 4.5,强制安装程序在中途重新启动,因为它在更新的同时使用 .NET 框架。同样,如果您使用自己的自定义托管引导程序,这只是一个问题。

    【讨论】:

    • 就我而言,我想通过 WixNetfxExtension 的 NetFx45Web 包组使用 Web 安装程序。我相应地更新了问题。使用内置包组时是否有与 InstallCondition 等效的方法?
    • InstallConditions 位于包本身(ExePackage、MsiPackage)上。此外,当前的 WiX 手册没有列出任何 .NET 4.5 属性来判断它是否已安装。我认为这些限制是我没有使用 NetfxExtension 进行设置的原因。 IMO,如果您想使用 NetfxExtension 安装 .NET 4.5,您可能只需添加 NetFx45Web 包组,然后在安装上设置一个条件,使其仅在 Vista 或更高版本上运行。然后,如果您需要 XP 安装,请创建单独的项目或配置以生成单独的安装程序。
    • 在没有 NetfxExtension 的情况下进行 .NET 的 Web 安装是否有一种不太困难的方法?
    • 是的。调用 Web 安装程序而不是完整的 .NET 安装程序。您可以从这里下载:msdn.microsoft.com/en-us/library/5a4x27ek.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多