我有一个使用两个CustomActions的MSI。第一个添加一些东西到注册表。它在卸载期间每次除之外运行。第二个删除注册表中的一个键,以便在卸载期间仅运行 。
两个CustomActions都可以正常工作,只是现在MSI不会卸载。
“它不会卸载”我的意思是,在运行卸载时,既不会删除已安装的文件,也不会从程序和功能中删除MSI。卸载过程中做唯一的事就是从注册表中删除内容的自定义操作。
请注意,问题发生在一台全新的虚拟机上,因此它不像是有旧版本,其中包含不同的GUID。
此外我认为功能没有问题,因为只有一个功能 - 文本文件安装(这是一个玩具安装 - 直到我做对了,它不会进入真正的安装程序)。
以下是两个自定义操作的<InstallExecutiveSequence>
代码。我把东西放到注册表中的那个,每次除了卸载:
<InstallExecuteSequence>
<Custom Action="CustomAction_CreateKey"
After="InstallInitialize">
</Custom>
</InstallExecuteSequence>
以下是我从注册表中删除的相同XML,在卸载过程中只需 :
<InstallExecuteSequence>
<Custom Action="CustomAction_DeleteKey"
After="InstallInitialize">
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
</Custom>
</InstallExecuteSequence>
卸载日志没有用(至少对我而言)。就是这样:
MSI(BC:6C)[15:27:15:733]:注:1:1725
MSI(BC:6C)[15:27:15:733]:注意:1:2205 2:3:错误
MSI(BC:6C)[15:27:15:733]:注意:1:2228 2:3:错误4:SELECT
Message
FROMError
WHEREError
= 1725MSI(BC:6C)[15:27:15:733]:注意:1:2205 2:3:错误
MSI(BC:6C)[15:27:15:733]:注意:1:2228 2:3:错误4:SELECT
Message
FROMError
WHEREError
= 1709MSI(BC:6C)[15:27:15:733]:产品:CustomActionDeleteKeySetup - 删除失败。
而且:
调用自定义操作DeleteKey!DeleteKey.CustomActions.DeleteTheKey
自定义操作抛出异常:
System.Reflection.TargetInvocationException:抛出了异常 通过调用的目标。 ---&GT; Microsoft.Deployment.WindowsInstaller.InstallerException:不能 从非立即自定义操作中访问会话详细信息
在 Microsoft.Deployment.WindowsInstaller.Session.ValidateSessionAccess()
at Microsoft.Deployment.WindowsInstaller.Session.set_Item(String property,String value)
在DeleteKey.CustomActions.DeleteTheKey(会话会话)
---内部异常堆栈跟踪结束---
我不确定在日志文件中要查找什么。
总结一下:自定义操作不会让我卸载。我把头发拉了出来。
修改
我设法让它工作,但我不知道为什么。它与条件有关
条件是这样的:卸载并且只卸载时,我想删除密钥。所以 - 如上所示 - 这是<InstallExecuteSequence>
代码:
<InstallExecuteSequence>
<Custom Action="CustomAction_DeleteKey"
After="InstallInitialize">
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
</Custom>
</InstallExecuteSequence>
然后我想在做除安装之外的所有事情时创建密钥。之前,我在<InstallExecuteSequence>
位中没有任何条件,但是当我将其更改为此时,它似乎有效(即自定义操作有效且卸载):
<InstallExecuteSequence>
<Custom Action="CustomAction_CreateKey"
After="InstallInitialize">
(NOT installed) OR (CHANGE) OR (REPAIR)
</Custom>
</InstallExecuteSequence>
问题是:它为什么有效?是因为早些时候我试图在卸载过程中同时运行两个自定义操作吗?