Installation 为什么我需要为wix中的版本升级指定新guid

Installation 为什么我需要为wix中的版本升级指定新guid,installation,wix,Installation,Wix,我刚刚根据前面的问题/答案更新了我们的wix安装脚本。 这个想法是为了防止旧版本“降级”新版本。因此,wix文件的某些部分如下所示: <Product Id="A_GUID" <Upgrade Id="18626be5-521c-4b58-ab8a-54baddf66679"> <UpgradeVersion Property="NEWERVERSIONDETECTED" Minimum="$(var.Version

我刚刚根据前面的问题/答案更新了我们的wix安装脚本。 这个想法是为了防止旧版本“降级”新版本。因此,wix文件的某些部分如下所示:

  <Product Id="A_GUID"
    <Upgrade Id="18626be5-521c-4b58-ab8a-54baddf66679">
      <UpgradeVersion
        Property="NEWERVERSIONDETECTED"
        Minimum="$(var.Version)"
        IncludeMinimum="no"
        OnlyDetect="yes"
        ExcludeLanguages="yes"        
        />
     </Upgrade>

     <CustomAction Id="NewerVersionFound" Error="Can't downgrade." />

     <InstallExecuteSequence>
       <Custom Action="NewerVersionFound"
             After="FindRelatedProducts">NEWERVERSIONDETECTED</Custom>
       <RemoveExistingProducts After="InstallInitialize" />
     </InstallExecuteSequence>

它与产品guid无关

它始终与在产品节点上指定为属性的升级代码相关

<Product Id="*" Name="name" Version="$(var.Version)" UpgradeCode="12345678-55F7-4731-A318-772EF75D2830">

在升级节点中,您查看的是升级代码(而不是产品guid)。 您可以指定多个升级代码来查找不同版本的软件。但是升级代码通常应该在产品中保持不变。请参见MS主页上的最佳实践

    <Upgrade Id="12345678-55F7-4731-A318-772EF75D2830">
        <UpgradeVersion ExcludeLanguages="no" Property="OLDVERSIONFOUND"   
            IgnoreRemoveFailure="yes" MigrateFeatures="no" IncludeMinimum="no"                
            Minimum="0.0.0.0" Maximum="$(var.Version)" IncludeMaximum="no"                
        />
        <UpgradeVersion OnlyDetect="yes" Property="NEWAPPFOUND" IncludeMinimum="yes" Minimum="$(var.Version)" Maximum="99.99.99.99" />
    </Upgrade>

通过一个定制的动作(你已经有了),你会对此做出反应

 <CustomAction Id="OldAppFound" Error="Newer app of [ProductName] is installed" />

当然,您需要在序列中安排测试(您也做了)


新发现
新发现
如有必要,删除旧的(代码中也有)



Bernd,感谢您的快速回复。我应该在我的示例中显示更多的wix代码,因为我有一个升级代码,并且对于所有版本都是相同的。因此,我的代码仍然允许使用UpgradeCode进行降级,除非我更改Guid。我注意到您在示例中使用了“Product Id=“*””。这不会自动为每个版本创建新的guid吗?@PeteOopNorf是的,我总是生成新的产品guid。是的,这不是最佳做法。我尽量避免进行小的或次要的更新。原因很简单,我不想在安装程序中设置“REINSTALLMODE=omus”并删除这些“安装了其他版本”的消息。但我就是这么做的,不需要更改产品代码。你只需要关心版本号和升级代码。看来我正在尝试做一些只对主要升级可用的小升级。根据;“此过程依赖于FindRelatedProducts操作,该操作仅在首次安装期间运行……由于使用重新安装执行次要升级,因此此过程无法用于确定次要升级包是否试图降级应用程序。”因此,在升级版本中使用FindRelatedProducts仅适用于主要升级(即产品ID的Guid更新)。@BerndOtt使用Product=“*”是完全合理的做法。这只意味着你决定只进行重大升级。“这是完全合理的。”彼得奥普诺夫说得对。上述解决方案仅适用于主要升级。小的升级需要做一些完全定制的事情。
    <InstallExecuteSequence>
        <Custom Action="OldAppFound" After="FindRelatedProducts">NEWAPPFOUND</Custom>
    </InstallExecuteSequence>
    <InstallUISequence>
        <Custom Action="OldAppFound" After="FindRelatedProducts">NEWAPPFOUND</Custom>
    </InstallUISequence>
    <InstallExecuteSequence>    
        <RemoveExistingProducts After="InstallInitialize" />
    </InstallExecuteSequence>