簡體   English   中英

在WiX Bundle中包含.NET安裝程序,不檢測是否已安裝

[英]Including .NET installer in WiX Bundle not detecting if already installed

我使用的是WiX 3.7,我無法使用簡單的<PackageGroupRef Id =“NetFx40Web”/> bundle元素,因為它不會帶來Net FX安裝程序包,或者將它嵌入到setup.exe中。 我已經在Bundle.wxs文件中為此創建了自己的包,但我仍然遇到了麻煩。 它似乎總是嘗試安裝.NET 4,即使機器已經安裝了.NET。

我不太確定InstallConditionDetectCondition之間的區別。 我認為如果評估為true,則使用InstallCondition來安裝軟件包,否則將其卸載。 如何處理通常是永久性的東西=是 ,例如大多數先決條件? 我認為, 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>

Bootstrapper安裝程序日志:

[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>

這里似乎有很多問題。

聽起來根本問題是如何包含嵌入在捆綁包中的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" />

DetectCondition就是"NETFRAMEWORK40" 這種差異可能會解釋您所看到的問題。

我在這個答案中使用的是.NET Framework 4.5.2。 要將.NET Framework包含為脫機安裝:

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

     <Bundle> <Chain> <PackageGroupRef Id="NetFx452" /> <MsiPackage ... /> </Chain> </Bundle> 
  2. 下載Microsoft .NET Framework 4.5.2(脫機安裝程序) ,並將其添加到Bootstrapper項目中。 (我把它放在一個名為“資源”的文件夾中。)

  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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM