如果已经安装在维克斯束包含.NET安装程序未检测(Including .NET installer

2019-09-02 09:16发布

我在WiX的3.7,我不能让简单的<PackageGroupRef编号=“NetFx40Web” />束元件的作用,因为它不跨网FX安装包带,或在SETUP.EXE把它嵌入。 我使出我创造我自己的软件包这一Bundle.wxs文件,但我仍然有麻烦。 它似乎总是尝试安装.NET 4,即使已经拥有.NET安装机器。

我不太清楚InstallConditionDetectCondition之间的差异。 我认为InstallCondition用于如果评估结果为真实的安装包,否则将其卸载。 如何与东西通常是永久性= YES,如大多数的先决条件这项工作? DetectCondition几乎是相反的,我认为,它会检查,如果它已经在系统上,如果是这样,不安装它。

下面是我的全Bundle.wxs文件,该文件是一个Visual Studio的WiX引导程序项目。 我试图查看注册表和范围了.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

更新,与解决方案。 我用内置的维克斯RegistrySearch,以确定它是否安装。 我不得不引用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>

Answer 1:

似乎有很多问题在这里。

这听起来像根的问题是如何为包括NETFX安装嵌入在您的包。 如果是这样,你是正确的,因为WixNetfxExtension不,今天支持。 你必须定义自己的副本,您的副本是接近(也许从什么是在复制src\ext\NetFxExtension\wixlib )。 你需要改变以获得嵌入在包中的NETFX的唯一的事情就是设置ExePackage/@Compressed属性为'yes' 。 或者你可以离开了Compressed属性掉,它会跟你的压缩Bundle元素(默认为'yes' )。

其次, DetectCondition并确定该包是在机器上。 Burn将以此为基础进行包装是否是机器上的顺理成章之事。 例如,在安装刻录将安装包,如果包不存在,但如果包已存在什么也不做。 当然,没有永久封装的忽略卸载。

三, InstallCondition指示是否包应有史以来计算机上安装。 如果计算结果为真,那么软件包可以安装(如果要安装缺席并要求)。 如果计算结果为假包被除去(如果存在)。

注意:您的注册表搜索和条件是什么,从在WiX的工具集,用于检测NETFX有点不同。 以下是NETFX的WiX的工具集使用检测:

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

DetectCondition然后只是"NETFRAMEWORK40" 。 这种差异可以解释你所看到的问题。



Answer 2:

我用了这个答案在.NET Framework 4.5.2。 包括.NET框架为脱机安装:

  1. 包括PackageGroupRef在你的元素Chain

     <Bundle> <Chain> <PackageGroupRef Id="NetFx452" /> <MsiPackage ... /> </Chain> </Bundle> 
  2. 下载的Microsoft .NET Framework 4.5.2(脱机安装程序) ,并将其添加到您的引导程序项目。 (我把它称为“资源”文件夹中。)

  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> 


文章来源: Including .NET installer in WiX Bundle not detecting if already installed