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 - Fatal编程技术网

Wix安装程序删除旧版本之前的主要升级自定义操作

Wix安装程序删除旧版本之前的主要升级自定义操作,wix,Wix,我正在使用wix安装程序(版本3),我有一个版本1.99的msi和另一个版本2.00的msi。我的应用程序可以通过调用一些参数来导入和导出数据库。我正在尝试执行主要升级,并尝试在升级前后调用自定义操作。 现在,自定义操作代码工作正常。问题是,在删除旧版本之前应该运行的代码在删除后运行,因此无法激活应用程序并生成备份文件 简言之:在删除旧版本之前,如何确定自定义操作的时间以完成其工作 我这样称呼他们: <CustomAction Id="doExport"

我正在使用wix安装程序(版本3),我有一个版本1.99的msi和另一个版本2.00的msi。我的应用程序可以通过调用一些参数来导入和导出数据库。我正在尝试执行主要升级,并尝试在升级前后调用自定义操作。 现在,自定义操作代码工作正常。问题是,在删除旧版本之前应该运行的代码在删除后运行,因此无法激活应用程序并生成备份文件

简言之:在删除旧版本之前,如何确定自定义操作的时间以完成其工作

我这样称呼他们:

    <CustomAction Id="doExport"
              Return="check"
              Execute="immediate"
              BinaryKey="ImportExportBinary"
              DllEntry="BeforeInstall" />

    <CustomAction Id="doImport"
                Return="check"
                Execute="immediate"
                BinaryKey="ImportExportBinary"
                DllEntry="AfterInstall" />

  <InstallExecuteSequence>
     <Custom Action="doExport" Before="InstallInitialize"> NOT Installed</Custom>
     <Custom Action="doImport" After="InstallFinalize"> NOT Installed</Custom>
  </InstallExecuteSequence>

未安装
未安装
编辑:

以下是主要的升级代码:

<MajorUpgrade AllowDowngrades="no" 
                Schedule="afterInstallFinalize"
                DowngradeErrorMessage='Cannot downgrade!' 
                AllowSameVersionUpgrades='yes' ></MajorUpgrade>


我尝试过使用CustomAction元素的“Execute”属性,但没有任何结果。

首先,进行升级,创建详细日志以确保自定义操作正常工作并被调用。您已将它们标记为立即,因此它们会在系统发生任何更改之前运行,并在删除旧产品之前被调用。当你说“代码工作得很好”时,你可能是指从你的交互帐户运行它。但事实并非如此。您的代码正在运行msiexec.exe进程,工作目录不是您所期望的,您的代码可能没有在正确的位置查找文件,它将不会被提升,因此可能无法执行它认为可以执行的操作。您的代码有很多可能无法按预期工作

如果您曾经将它们标记为延迟,我可以理解为什么doExport可能不起作用。如果没有看到您的主要升级元素,我无法确定,但是RemoveExistingProducts的默认计划是afterInstallValidate。您的自定义操作是在InstallInitialize之前进行的,因此MSI文件中的实际序列可以很容易地进行InstallValidate、RemoveExistingProducts、doExport、InstallInitialize

并且在您的自定义操作之前删除卸载旧版本的现有产品


因此,如果您想使用execute deferred,请在doExport上使用Before=“RemoveExistingProducts”,或者在Major中使用Schedule升级到afterInstallInitialize,并在InstallInitialize之前保留doExport

Hi@PhilDW,我有一个简单的txt日志,可以证明它到达了代码并执行了它。我还添加了majorupgrade元素。显然,这不仅仅是因为它执行代码,还因为代码是否工作。如果代码在没有检查错误的情况下顺利通过,则假定一切正常,那么显然它将不工作。您的代码可能只是有一个异常捕捉器,该捕捉器会一直运行到最后,或者它总是在不起作用时返回success。正如我所说,您的代码的运行方式与从交互式帐户运行的测试不同。