【问题标题】:Including .NET installer in WiX Bundle not detecting if already installed在 WiX Bundle 中包含 .NET 安装程序未检测是否已安装
【发布时间】:2013-05-04 04:14:20
【问题描述】:

我在 WiX 3.7 上,我无法让简单的 捆绑元素工作,因为它没有带来 Net FX 安装程序包,也没有将它嵌入到安装程序。我已经在我的Bundle.wxs 文件中为此创建了自己的包,但我仍然遇到了麻烦。似乎总是尝试安装 .NET 4,即使机器已经安装了 .NET。

我不太确定 InstallConditionDetectCondition 之间的区别。如果评估为真,我认为 InstallCondition 用于安装包,否则将其卸载。这如何处理通常permanent=yes 的东西,例如大多数先决条件?我认为 DetectCondition 几乎相反,因为它检查它是否已经在系统上,如果是,则不安装它。

下面是我在 Visual Studio WiX Bootstrapper 项目中的完整 Bundle.wxs 文件。我正在尝试查看 .NET 4.0 注册表项之外的注册表和范围。如果它存在,那么我不想安装 .NET 4。如果它不存在,则安装它。但是,这不起作用,它总是尝试安装 .NET。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Bundle
        Name="MyProgramBootstrapper"
        Version="1.0.0.0"
        Manufacturer="Microsoft"
        UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}">

        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
        <Chain>
          <PackageGroupRef Id="Netfx4Full"/>
          <MsiPackage
              Id="MyProgramInstaller"
              SourceFile="$(var.MyProgramInstaller.TargetPath)"
              Compressed="no"/>
        </Chain>
    </Bundle>

    <Fragment>
        <Property Id="NET40_FULL_INSTALL_32">
            <RegistrySearch
                Id ="SearchNet40_32bit"
                Root="HKLM"
                Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
                Name="Version"
                Type ="raw"/>
        </Property>
        <Property
            Id="NET40_FULL_INSTALL_64">

            <RegistrySearch
                Id ="SearchNet40_64bit"
                Root="HKLM"
                Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
                Name="Version"
                Type ="raw"
                Win64="yes" />
        </Property>

        <WixVariable
            Id="WixMbaPrereqPackageId"
            Value="Netfx4Full" />
        <WixVariable
            Id="WixMbaPrereqLicenseUrl"
            Value="NetfxLicense.rtf" />
        <PackageGroup
            Id="Netfx4Full">
          <ExePackage
              Id="Netfx4Full"
              Cache="no"
              Compressed="no"
              PerMachine="yes"
              Permanent="yes"
              Vital="yes"
              SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe"
              DetectCondition="NET40_FULL_INSTALL_32 OR NET40_FULL_INSTALL_64"
              DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/>
        </PackageGroup>
    </Fragment>
</Wix>

引导程序安装程序日志:

[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: Netfx4Full, invalid payload: Netfx4Full, reason: 0x80070570
[010C:2FB0][2013-05-10T12:07:07]i052: Condition 'NETFRAMEWORK40' evaluates to false.
[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: MyInstaller, invalid payload: f4832BA0972BDE9B6FA8A19FBB614A7BA, reason: 0x80070570
[010C:2FB0][2013-05-10T12:07:07]i101: Detected package: Netfx4Full, state: Absent, cached: Partial

更新,解决方案。我使用内置的 WiX RegistrySearch 来确定它是否已安装。我必须在我的 Bundle 项目中引用 WixUtilExtension.dll。这是更新后的 Bundle.wxs:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
>
    <Bundle
        Name="MyProgramBootstrapper"
        Version="1.0.0.0"
        Manufacturer="Microsoft"
        UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}">

        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
        <Chain>
            <PackageGroupRef Id="Netfx4Full"/>
            <!-- TODO: Define the list of chained packages. -->
                  <!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
            <MsiPackage
                Id="MyProgramInstaller"
                SourceFile="$(var.MyProgramInstaller.TargetPath)"
                Compressed="no"  />
        </Chain>
    </Bundle>

    <Fragment>
        <util:RegistrySearchRef Id="NETFRAMEWORK40"/>
        <PackageGroup
            Id="Netfx4Full">

            <ExePackage
                Id="Netfx4FullExe"
                Cache="no"
                Compressed="no"
                PerMachine="yes"
                Permanent="yes"
                Vital="yes"
                SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe"
                InstallCommand="/q /norestart /ChainingPackage FullX64Bootstrapper"
                DetectCondition="NETFRAMEWORK40"
                DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/>
        </PackageGroup>
    </Fragment>
</Wix>

【问题讨论】:

  • 如果我正确阅读了您的问题,我认为您的问题的标题具有误导性。问题不在于WixNetfxExtension 无法正常工作。问题是您今天想做WixNetfxExtension 不支持的事情。对其他人来说更具描述性的标题可能是:“如何将 .NET Framework 压缩到一个 Bundle 中”。如果我在下面的回答完全错误,请随意忽略此评论。 :)
  • @RobMensching,正确,标题具有误导性。我可以将安装程序松散/相邻包含在 exe 中,这就是我想要的。但是,我的条件无法检测 .NET 是否已安装,我不知道为什么。
  • 与其在问题中添加答案,不如将其添加为答案。 Stackoverflow 非常支持这一点。 (如果不阅读整个内容而不是浏览实际答案,很难看到问题中有嵌入的答案)

标签: wix bootstrapper wix3.7


【解决方案1】:

我在这个答案中使用 .NET Framework 4.5.2。将 .NET Framework 作为离线安装包含:

  1. 在您的Chain 中包含PackageGroupRef 元素:

    <Bundle>
        <Chain>
            <PackageGroupRef Id="NetFx452" />        
            <MsiPackage ... />
        </Chain>
    </Bundle>
    
  2. Download the Microsoft .NET Framework 4.5.2 (Offline Installer),并将其添加到您的引导程序项目中。 (我把它放在一个名为“资源”的文件夹中。)

  3. 添加以下Fragment

    <Fragment>
        <util:RegistrySearchRef Id="NETFRAMEWORK45"/>
        <PackageGroup Id="NetFx452">
            <ExePackage Id="NetFx452"
                        Cache="no"
                        Compressed="yes"
                        PerMachine="yes"
                        Permanent="yes"
                        Vital="yes"
                        Name="NDP452-KB2901907-x86-x64-AllOS-ENU.exe"
                        SourceFile="Resource\NDP452-KB2901907-x86-x64-AllOS-ENU.exe"
                        DetectCondition="NETFRAMEWORK45"
                        InstallCommand="/q /norestart"  />     
        </PackageGroup>
    </Fragment>
    

【讨论】:

    【解决方案2】:

    这里似乎有很多问题。

    听起来根本问题是如何将 NETFX 安装嵌入到您的捆绑包中。如果是这样,那么WixNetfxExtension 今天不支持它是正确的。您确实必须定义自己的副本并且您的副本很接近(可能从src\ext\NetFxExtension\wixlib 中的内容复制)。要将 NETFX 嵌入到包中,您唯一需要更改的是将ExePackage/@Compressed 属性设置为'yes'。或者您可以关闭 Compressed 属性,它将遵循您的 Bundle 元素的压缩(默认为 'yes')。

    其次,DetectCondition 确实确定包是否在机器上。 Burn 会根据包是否在机器上来做逻辑上的事情。例如,在安装过程中,如果包不存在,Burn 将安装包,但如果包已经存在,则不执行任何操作。当然,缺席和永久包会忽略卸载请求。

    第三,InstallCondition 表示该软件包是否应该安装在机器上。如果它评估为真,则可以安装包(如果不存在并请求安装)。如果评估结果为 false,则删除包(如果存在)。

    注意:您的注册表搜索和条件与 WiX 工具集中用于检测 NETFX 的内容略有不同。以下是 WiX 工具集使用的 NETFX 检测:

    <util:RegistrySearch
        Id="NETFRAMEWORK40"
        Variable="NETFRAMEWORK40"
        Root="HKLM"
        Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
        Value="Install"
        Result="value" />
    

    DetectCondition 就是 "NETFRAMEWORK40"。这种差异可能解释了您所看到的问题。

    【讨论】:

    • 我实际上没有问题,包括 NET 40 安装程序。我的主要问题是我的检测条件无法正常工作,即使系统上安装了 .net 4.0,它也总是会尝试安装该软件包。
    • 我更新了答案以包括 WiX 工具集使用的 NETFX 4 检测。
    • 在放弃我的注册表搜索并将 DetectCondition 更改为 NETFRAMEWORK40 后,它仍然尝试在已经具有 .NET 4 的测试机器 (x64) 上安装 .NET4
    • 查看刻录日志文件。我不知道还能说什么。该条件适用于 WiX 工具集安装。
    • 我不确定刻录日志在哪里。当我在 VS 中构建引导程序时,我只能看到烛光的构建日志。我将安装程序日志添加到我的主要问题中
    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2012-11-23
    • 2022-11-27
    相关资源
    最近更新 更多