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 MajorUpgrade会删除旧版本,但不会安装新版本,除非MSI再次运行_Wix_Windows Installer - Fatal编程技术网

Wix MajorUpgrade会删除旧版本,但不会安装新版本,除非MSI再次运行

Wix MajorUpgrade会删除旧版本,但不会安装新版本,除非MSI再次运行,wix,windows-installer,Wix,Windows Installer,我有两个MSI,它们除了ProductID和版本之外是相同的。我正在测试MajorUpgrade路径 具有更高版本的MSI关闭Windows服务,并删除所有工件,但在安装新二进制文件时失败,并出现1603错误。事实上,它看起来正在执行卸载,包括文件和注册表清理,但随后无法执行安装 如果我再次运行更高版本的MSI,安装工作正常:创建文件和目录,启动Windows服务,以及我设置在安装完成后运行的可执行文件 我在下面生成了一个详细的日志片段,但修复文件未复制到正确位置的问题并不明显 Wix代码: &

我有两个MSI,它们除了ProductID和版本之外是相同的。我正在测试MajorUpgrade路径

具有更高版本的MSI关闭Windows服务,并删除所有工件,但在安装新二进制文件时失败,并出现1603错误。事实上,它看起来正在执行卸载,包括文件和注册表清理,但随后无法执行安装

如果我再次运行更高版本的MSI,安装工作正常:创建文件和目录,启动Windows服务,以及我设置在安装完成后运行的可执行文件

我在下面生成了一个详细的日志片段,但修复文件未复制到正确位置的问题并不明显

Wix代码:

<Product Id="*"
    Name="product name"
    Language="1033"
    Version="1.2.0"
    Manufacturer="Company Name"
    UpgradeCode="stable-upgrade-guid">

<!-- snip -->

<Property Id="WixShellExecTarget" Value="[#TheProgram.exe]" />
    <CustomAction Id="LaunchApplication"
                  BinaryKey="WixCA"
                  DllEntry="WixShellExec"
                  Impersonate="yes" />

    <MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." />

    <InstallExecuteSequence>
      <Custom Action="CheckForRunningProcesses_CA" After="InstallValidate" />
      <Custom Action="LaunchApplication" After="InstallFinalize"/>
    </InstallExecuteSequence>
我相信ShellExec返回代码2表示找不到文件。实际上,程序文件目录不存在。 我不确定返回值为3的LaunchApplication意味着什么。我猜没有找到文件。
你知道为什么MajorUpgrade会删除旧版本,但不会安装新版本,但在后续运行中,它会删除吗?

问了这个问题后,我很自然地发现了答案。线索是,不知怎么的,我没有看到

为了解决这个问题,你需要移动你的 稍后删除现有产品操作。如果您正在使用MajorUpgrade 元素,然后调度为“afterInstallExecute”或 Schedule='afterInstallFinalize'应该可以做到这一点。你需要 更仔细地使用组件规则

将MajorUpdate的计划更改为afterInstallExecute是解决方案:

<MajorUpgrade
      DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."
      Schedule="afterInstallExecute" />
一点也不明显。

这不完全是复制品。类似的症状,完全不同的日志文件。解决方案是一样的,但根本问题是不同的。
<MajorUpgrade
      DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."
      Schedule="afterInstallExecute" />