我正在使用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安装程序以便首先调用该函数然后在卸载期间删除文件?
由于
答案 0 :(得分:3)
谢谢波格丹。根据日志,问题是安装程序试图执行我想要仅在安装时运行的CustomAction。为此,我应该在自定义操作中添加“NOT Installed”,该操作应该仅在安装期间运行。如下:
<Custom Action="Register" Before="InstallFinalize">NOT Installed</Custom>
答案 1 :(得分:0)
这是一个评论,因为你已经解决了你的具体问题......
您应该从应用程序库中分离出安装逻辑。您运行的任何自定义操作操作都应该在未自行安装的文件中实现。一个原因是文件可能丢失导致卸载失败。
您似乎正在使用某种自我注册机制。这是Windows Installer旨在避免的反模式。对于注册表项,您可以使用WiX的注册表项声明来创建和删除注册表项。对于由应用程序创建的文件和文件夹也是如此。
但是,卸载时机器擦拭是不合理的。应该删除的内容和应该留下的内容有很多灰色区域。一端是应用程序二进制文件(应该不见了);另一端是用户通过应用程序创建的文档。可能由用户亲自选择的设置是中间的许多其他设置(重新安装后可以保留以供将来使用)。