Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Wix更新以前安装的程序版本_Wix_Installation - Fatal编程技术网

如何让Wix更新以前安装的程序版本

如何让Wix更新以前安装的程序版本,wix,installation,Wix,Installation,我用Wix编写了一个安装程序,安装我的程序效果很好。 现在我需要更新它,所以我增加了版本号,但当我在旧程序上安装新程序时,它会抱怨已经安装了旧版本,并告诉我先卸载它 如何在重新安装之前更新或自动卸载它?您需要使用升级表: <Upgrade Id='15E2DAFB-35C5-4043-974B-0E342C25D76A'> <UpgradeVersion Property='OLDVERSIONFOUND' IncludeMinimum='no' Minimum='0.

我用Wix编写了一个安装程序,安装我的程序效果很好。 现在我需要更新它,所以我增加了版本号,但当我在旧程序上安装新程序时,它会抱怨已经安装了旧版本,并告诉我先卸载它


如何在重新安装之前更新或自动卸载它?

您需要使用升级表:

<Upgrade Id='15E2DAFB-35C5-4043-974B-0E342C25D76A'>
    <UpgradeVersion Property='OLDVERSIONFOUND' IncludeMinimum='no' Minimum='0.0.0.0' />
</Upgrade>

您还需要添加一个操作:

<InstallExecuteSequence>
    <LaunchConditions After='AppSearch' />
    <RemoveExistingProducts After='InstallValidate' />
</InstallExecuteSequence>


我查看了上面提到的所有帖子,但仍然花了很长时间试图让它发挥作用

步骤3中的提示有很大帮助:您需要一个新的
产品/@Id
来禁用消息“此产品的另一个版本已安装”

我使用了此升级部分(产品的子项):


还要注意,显然,只有版本号的前三个组件用于检查升级…

只需将此元素放在
产品
元素下:

<MajorUpgrade AllowDowngrades="yes" />


更多信息在

我觉得提供的答案没有一个是完整的或独立的,所以在我穿过这片沼泽地之后,以下是我认为必要的步骤,以使更新(完全不言而喻)要求生效:

  • 确保每次构建时产品Id都会更改。如果您不这样做,您将始终收到OP提到的“已安装”消息

    <Product Id="*" ...>
    
  • 这是我的整个.wix文件(相关部分,导致用于产品绑定的程序集的两个片段大部分是可选的,为了便于说明,您可以通过任何方式获得程序集):


    我试过这个,它对我有效

  • 将您的产品标签如下所示: 产品Id=“*”Name=“Something”Language=“1033”Version=“1.0.0.0”Manufacturer=“Someone”UpgradeCode=“43ab28d7-6681-4a05-a6b5-F980733EEED”

  • 产品Id应设置为*以便每次构建项目时,都采用不同的Id

  • 在Package元素中嵌套一个MajorUpgrade标记,如下所示: MajorUpgrade AllowDowngrades=“否”降级错误消息=“已安装较新版本的[ProductName]。AllowSameVersionUpgrades=“是”/

  • 因此,每次更新版本(或版本相同,不低于当前版本)时,它都会通过删除以前的文件并安装产品文件来重新安装产品。
    它将不会降级您的产品。

    对于那些新变量(即
    $(var.property)
    语法);嘿,这正是我安装的方式。然后,我注意到每次安装的控制面板程序中都有一个条目。我尝试使用一个固定的产品Id,这让我在谷歌上搜索这个答案。结合Randy Eppinger的评论(必须至少增加版本的第三位数字),您可以充分利用这两个方面。请注意,如果您有多个项目文件(.wxs)文件,此解决方案将不起作用。Wix工具(灯)将抱怨重复的升级代码(GUID)。我使用“MajorUpgrade”来解决此问题教程链接已断开,但现在很好:Thx,我更正了断开的链接。感谢您修复此海报的链接:-)不存在,请提供建议。我在VS 2013中使用wix 3.8。我认为.wxs文件的结构不同,因此不确定“notthere”是什么意思。但是您是否定义了您的文件(请参见带有的片段)?回答得很好。我建议进一步阅读:和@KoenVanLooveren:您需要用您自己的项目特定信息替换MyAssemblyDll及其路径(在我的示例中,001_MyApplication.MyAssembly将是同一解决方案中的项目名称)。请注意,这只是建议如何保持版本递增(将其绑定到执行自动递增的程序集版本)。要进行测试,您也可以忽略所有这些,然后编写
    。请再读一遍第2节,看一看。最后是一位真正解释WIX工作原理的人。文档完全失败了。将产品ID更改为
    *
    对我的案例有效。
    <MajorUpgrade AllowDowngrades="yes" />
    
    <Product Id="*" ...>
    
    <Product Version="!(bind.FileVersion.MyAssemblyDll)" ...>
    <File Id="MyAssemblyDll" Name="$(var.001_Application.MyAssembly.TargetFileName)" Source="$(var.001_Application.MyAssembly.TargetPath)" />
    
    <Product UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be" ...>
    
    <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    
    <?xml version="1.0" encoding="UTF-8"?>
    <?define ProductVersion="!(bind.FileVersion.MyAssemblyDll)"?>
    <?define UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be"?>
    
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
      <Product
        Id="*"
        Name="My Product's name"
        Language="1033"
        Version="$(var.ProductVersion)"
        Manufacturer="My company"
        UpgradeCode="$(var.UpgradeCode)"
        Codepage="1252">
    
        <Package
          InstallerVersion="200"
          Compressed="yes"
          InstallScope="perUser"
          Description="My product description"
          Manufacturer="My company"
          Languages="1033"
          SummaryCodepage="1252"
          InstallPrivileges="limited" />
    
        <MajorUpgrade AllowSameVersionUpgrades="yes" 
                      DowngradeErrorMessage="A newer version of [ProductName] is already installed. If you are sure you want to downgrade, remove the existing installation via Programs and Features." />
    
      </Product>
    
      <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
          <Directory Id="LocalAppDataFolder">
            <Directory Id="INSTALLFOLDER" Name="My Install Dir" >
              <Component Id="INSTALLFOLDER" Guid="f6ba8a12-6493-4911-8edd-dce90e1d8e8b" >
                <RemoveFolder On="both" Id="INSTALLFOLDER"/>
                <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="My Registry value" />
              </Component>
            </Directory>
          </Directory>
        </Directory>
      </Fragment>
    
      <Fragment>
        <ComponentGroup Id="ProductComponents" >
          <Component Id="ProductComponent" Guid="1939f0f5-19f6-498b-bf95-8f1c81501294" DiskId="1" Directory="INSTALLFOLDER" >
            <File Id="MyAssemblyDll" Name="$(var.001_MyApplication.MyAssembly.TargetFileName)" Source="$(var.001_MyApplication.MyAssembly.TargetPath)" />
          </Component>
        </ComponentGroup>
      </Fragment>
    </Wix>