在 WiX Bundle 中包含 .NET 安装程序未检测是否已安装

2024-04-25

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

我不太确定之间的区别安装条件 and 检测条件。我认为安装条件用于如果评估为真则安装该软件包,否则卸载该软件包。这如何处理通常的事情永久=是,比如大多数先决条件?检测条件我认为几乎相反,因为它检查它是否已经在系统上,如果是,则不安装它。

下面是我的完整版Bundle.wxs文件位于 Visual Studio WiX Bootstrapper 项目中。我正在尝试查看注册表,并且存在超出 .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

更新一下,有解决方案。我使用内置的 WiXRegistrySearch 来确定它是否已安装。我必须在我的 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>

这里似乎有很多疑问。

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

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

第三,InstallCondition指示是否应将软件包安装在计算机上。如果评估结果为 true,则可以安装该软件包(如果不存在并请求安装)。如果评估结果为 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" />

The DetectCondition那么就只是"NETFRAMEWORK40"。这种差异可能可以解释您所看到的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WiX Bundle 中包含 .NET 安装程序未检测是否已安装 的相关文章

随机推荐