卸载期间WIX中的自定义操作

时间:2014-01-20 22:08:27

标签: wix windows-installer custom-action uninstaller

我正在使用WIX来创建应用程序的安装程序。 在卸载应用程序期间,我想在卸载程序删除DLL文件所属的文件之前调用DLL文件中的函数。我查看了其他相关帖子this post以继续。

我创建了一个CustomAction,如下所示:

<CustomAction Id="UnRegister" 
              FileKey="mydll.dll" 
              DllEntry="cleanup" 
              Execute="immediate" 
              Return="ignore"/>

然后是InstallExecuteSequence代码:

<InstallExecuteSequence>
    <Custom Action="UnRegister" After="InstallInitialize">Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
</InstallExecuteSequence>

问题是当我尝试卸载应用程序时,首先删除文件,然后安装程序调用DLL中的cleanup()函数。出错后,卸载回滚并失败。

如何配置WIX安装程序以便首先调用该函数然后在卸载期间删除文件?

由于

2 个答案:

答案 0 :(得分:3)

谢谢波格丹。根据日志,问题是安装程序试图执行我想要仅在安装时运行的CustomAction。为此,我应该在自定义操作中添加“NOT Installed”,该操作应该仅在安装期间运行。如下:

<Custom Action="Register" Before="InstallFinalize">NOT Installed</Custom>

答案 1 :(得分:0)

这是一个评论,因为你已经解决了你的具体问题......

您应该从应用程序库中分离出安装逻辑。您运行的任何自定义操作操作都应该在未自行安装的文件中实现。一个原因是文件可能丢失导致卸载失败。

您似乎正在使用某种自我注册机制。这是Windows Installer旨在避免的反模式。对于注册表项,您可以使用WiX的注册表项声明来创建和删除注册表项。对于由应用程序创建的文件和文件夹也是如此。

但是,卸载时机器擦拭是不合理的。应该删除的内容和应该留下的内容有很多灰色区域。一端是应用程序二进制文件(应该不见了);另一端是用户通过应用程序创建的文档。可能由用户亲自选择的设置是中间的许多其他设置(重新安装后可以保留以供将来使用)。