1

これを、Bundle / Burnを使用するのではなく、Product / .msiで直接機能させる必要があります。)

私はWiX 3.6を使用しています。

レジストリ値を変数に入れるフラグメント

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <?include $(sys.CURRENTDIR)Deployment\Data\Statics.wxi ?>
  <Fragment>
    <util:RegistrySearch Root="HKCU" Key="$(var.Line.Reg.Path)" Value="Version" Variable="AppAlreadyInstalled" />
  </Fragment>
</Wix>

作動していない状態の主な製品

<Product Name="$(var.App.Title)" Manufacturer="!(loc.Company)" Language="!(loc.Lang)" Id="*" Version="$(var.VersionNumber)" UpgradeCode="$(var.App.UpgradeCode)">
    <Package Id="*" InstallerVersion="300" Compressed="yes" InstallScope="$(var.App.Elevation)" InstallPrivileges="limited" />
    <DirectoryRef Id="TARGETDIR" />
    <MajorUpgrade Schedule="afterInstallValidate" DowngradeErrorMessage="!(loc.Msi.NewerVersionInstalled)" />
    <Property Id='DiskPrompt' Value="$(var.App.Title) Installation Media" />
    <Media Id="1" Cabinet="Media.cab" EmbedCab="yes" DiskPrompt="#1" />
    <Icon Id="AppIcon" SourceFile="$(var.Icon.Path)" />

    <Condition Message="Newer version already installed.">
        <![CDATA[Installed OR AppAlreadyInstalled]]>
    </Condition>

    <Feature Id="ProductFeature" Level="1">
         ...
    </Feature>
</Product>
  • AppAlreadyInstalledは別のファイルのフラグメントにあるため、現時点では設定されていないと思います。
  • 次に、レジストリ値がまったく見つからない/存在しない場合は、実際にインストールを続行します。
  • ただし、存在する場合は、レジストリ値が特定の値を下回っている場合にのみインストールを続行します。たとえば、AppAlreadyInstalled<1.3.44の場合にのみインストールを続行します。レジストリ値は2つのピリオド/ピリオドを持つ文字列として格納されるため、これを実現するのは難しいように思われます。
  • レジストリチェックは、DowngradeErrorMessageによってすでに処理されている、インストールされるアプリケーションのものではないことに注意してください。
4

1 に答える 1

2

WixUtilExtension:RegistrySearchバンドル専用です。RegistrySearchWiX 名前空間にプレーンが必要です。RegistrySearchRefを使用して、別のフラグメントからRegistrySearchを取り込むことができます。

ただし、バージョン比較に問題があることは間違いありません。MSI は序数に基づく文字列比較を行い1.2 > 1.10ます。インストール ディレクトリがレジストリにある場合は、RegistrySearchをDirectorySearchおよびFileSearchと組み合わせて使用​​することをお勧めします。FileSearch属性を使用してバージョンで検索MinVersionできるため、製品を検出するために使用できるバージョンのファイルがあれば、文字列比較よりも信頼性が高くなります。

于 2012-07-23T05:00:17.640 に答える