我正在使用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”属性,但没有任何结果。
答案 0 :(得分:1)
首先,进行升级以创建详细日志,以确保自定义操作正在运行并被调用。您已立即对它们进行了标记,因此它们会在系统发生任何更改之前运行,因此将在删除旧产品之前调用它们。当你说&#34;代码工作得很好&#34;你可能的意思是当你从交互式帐户运行它。但那并没有发生。您的代码用完msiexec.exe进程,工作目录不是您所期望的,您的代码可能找不到正确的文件位置,它不会被提升,因此可能无法做到这一点认为它可以。您的代码有很多机会无法按预期工作。
如果您将它们标记为延期,我可以看到为什么doExport可能无效。如果没有看到您的MajorUpgrade元素,我无法确定,但RemoveExistingProducts的默认调度是afterInstallValidate。您的自定义操作在InstallInitialize之前,因此MSI文件中的实际序列可以很容易地是InstallValidate,RemoveExistingProducts,doExport,InstallInitialize。
执行卸载旧版本的和RemoveExistingProducts位于自定义操作之前。
因此,如果您想使用execute deferred,请尝试Before =&#34; RemoveExistingProducts&#34;在您的doExport上,或使用MajorUpgrade中的Schedule to afterInstallInitialize并在InstallInitialize之前保留doExport。