2010-03-10 82 views
2

我一直在使用Wix,使用自动生成的安装程序和三个版本来测试可升级性1.0,1.1和2.0的小应用程序。使用Wix MSI检测启动条件下的卸载

1.1意味着能够从1.0升级,并且不允许用户在1.1已经存在的情况下安装1.1。

 <Upgrade Id="MY_UPGRADECODE_GUID"> 
      <UpgradeVersion Minimum="1.0.0" 
              IncludeMinimum="yes" 
              Maximum="1.0.0" 
              IncludeMaximum="yes" 
              Property="OLDERVERSIONBEINGUPGRADED" /> 
      <UpgradeVersion Minimum="1.1.0" 
              IncludeMinimum="yes" 
            OnlyDetect="yes" 
            Property="NEWERVERSIONDETECTED" /> 
     </Upgrade> 

     <Condition Message="A later version of [ProductName] is already installed. Setup will now exit."> 
      NOT (NEWERVERSIONDETECTED OR Installed) 
     </Condition> 

问题#1:1.1不能被卸载,因为在条件设置和在卸载过程中检查。

2.0意味着能够从1.1升级,而不是从1.0升级('太旧')。它不应该能够自行安装。

<Upgrade Id="MY_UPGRADECODE_GUID"> 
     <UpgradeVersion Minimum="1.1.0" 
     IncludeMinimum="yes" 
     Maximum="1.1.0" 
     IncludeMaximum="yes" 
     Property="OLDERVERSIONBEINGUPGRADED" /> 
    </Upgrade> 

    <Upgrade Id="MY_UPGRADECODE_GUID"> 
     <UpgradeVersion Minimum="2.0.0" 
     OnlyDetect="yes" 
     Property="NEWERVERSIONDETECTED" /> 
    </Upgrade> 

    <Upgrade Id="MY_UPGRADECODE_GUID"> 
     <UpgradeVersion Minimum="1.0.0" 
     IncludeMinimum="yes" 
     Maximum="1.0.0" 
     IncludeMaximum="yes" 
     Property="TOOOLDVERSIONDETECTED" /> 
    </Upgrade> 

    <Condition Message="A later version of [ProductName] is already installed. Setup will now exit."> 
     NOT NEWERVERSIONDETECTED OR Installed 
    </Condition> 

    <Condition Message="A version of [ProductName] that is already installed is too old to be upgraded. Setup will now exit."> 
     NOT TOOOLDVERSIONDETECTED 
    </Condition> 

问题2:如果我试图从1.1升级,我打到了我的修改后的版本条件。 (错误:主应用程序的更高版本1.1已安装,安装程序现在将退出。) 问题3:安装程序允许我在其自身顶部安装2.0。

我在做什么错我的升级代码和条件在我的MSIs中得到这些问题?

回答

3

好的,我发现有一个技巧可以用来检测卸载。

我的版本1.1 WXS改为:

 <Condition Message="A later version of [ProductName] is already installed. Setup will now exit."> 
      NOT NEWERVERSIONDETECTED OR REMOVE ~= "ALL" 
     </Condition> 

和2.0版本:

 <Condition Message="A later version of [ProductName] is already installed. Setup will now exit."> 
      NOT NEWERVERSIONDETECTED OR REMOVE ~= "ALL" 
     </Condition> 

     <Condition Message="A version of [ProductName] that is already installed is too old to be upgraded. Setup will now exit."> 
      OLDERVERSIONBEINGUPGRADED OR (NOT Installed AND NOT TOOOLDVERSIONDETECTED) OR REMOVE ~= "ALL" 
     </Condition> 

所以我LaunchConditions将永远不会触发的卸载,将正确检测是否有正在升级的版本从。

+0

严格地说,这只是因为WiX在LaunchConditions之前对FindRelatedProducts操作进行排序。因此,例如,如果UI为您提供了每个用户和每台机器之间的选择,则只有在用户做出选择之后才能运行FindRelatedProducts,因为搜索需要知道安装上下文。因此它不能用在发光条件下。 – PhilDW 2015-10-24 18:26:15

1

我假设当你提到给定版本的应用程序时,说“应用程序1.1”,你总是谈论相同的可安装图像。与多个不同的可安装映像(例如具有不同的软件包代码)相反,它们恰好共享产品版本号。

如果是这种情况,那么当已安装应用程序1.1时,您不需要执行任何操作来显式阻止用户安装应用程序1.1。安装程序服务将识别已安装的应用程序1.1,并且它不会让您再次安装它。它将进入维护模式。它认为你想添加或删除功能,或者卸载该产品。