我尝试在wix安装程序中执行我的自定义操作,以便在安装软件之前在InstallExecuteSequence中编写删除注册表项,如下所示:
<InstallExecuteSequence>
<Custom Action="RemoveExistingReristryKey" Sequence="150">NOT Installed</Custom>
</InstallExecuteSequence>
运行.msi文件时,调用了RemoveExistingReristryKey函数并删除了注册表项,我可以看到日志:
... 行动结束17:12:59:CostFinalize。返回值1。
MSI(c)(90:54)[17:12:59:596]:执行操作:RemoveExistingReristryKey 行动17:12:59:RemoveExistingReristryKey。 行动开始17:12:59:RemoveExistingReristryKey。 MSI(c)(90:E4)[17:12:59:616]:调用远程自定义操作。 DLL:C:\ Users \ CUONG~1.HUY \ AppData \ Local \ Temp \ MSIF947.tmp,Entrypoint:_RemoveExistingReristryKey @ 4 MSI(c)(90:8C)[17:12:59:616]:启用伪装。 MSI(c)(90:8C)[17:12:59:616]:在调用Install on Server之前尝试启用所有禁用的权限 MSI(c)(90:8C)[17:12:59:616]:连接到CA接口的服务。 RemoveExistingReristryKey:删除了先前安装的注册表项。 行动结束17:12:59:RemoveExistingReristryKey。返回值1。
MSI(c)(90:54)[17:12:59:668]:采取行动:MaintenanceWelcomeDlg ...
但是,我想要解决的错误仍然会发生,但是,如果我手动删除此注册表项,错误就会消失。
我想也许我的自定义操作执行得太晚,所以我尝试通过自定义操作的一些选项进行编辑,例如:在InstallExecuteSequence中的before,after,sequence之前立即执行此自定义操作,然后执行所有其他操作,但是&# 39; s仍然没有,它总是在标准动作之后执行&#34; CostFinalize&#34;。
如何在运行.msi文件时立即执行自定义操作以删除注册表项?
非常感谢你!
答案 0 :(得分:1)
我对你要做的事情感到困惑,但对我来说,听起来你实际上是在管理你的自定义行为时实际管理 - 你有两个它们发生在错误的顺序中。
我有两条建议:如果你真的希望一个自定义操作在另一个之前发生,请安排 InstallUISequence 中的第一个和 InstallExecuteSequence 中的第二个。 InstallUISequence发生在InstallExecuteSequence之前。
第二个是真正关注使用ORCA进行自定义操作的时间。使用ORCA打开 .msi 文件,然后转到 InstallExecuteSequence 表,然后单击“序列”列以排序&#34;当操作发生时#34;。
在这个例子中,我有两个自定义动作(带圆圈),我必须一个接一个。为了做到这一点,我做了一些事情:
<InstallExecuteSequence>
<Custom Action="SetCustomAction_EncryptKey"
After="InstallInitialize"/>
<Custom Action="CustomAction_EncryptKey"
After="SetCustomAction_EncryptKey"/>
</InstallExecuteSequence>
这保证了一个接一个地发生。话虽如此,我也可以做到这一点,以确保第二个不一定是下一个动作,而是第一个动作之后的行动之一:
<InstallUISequence>
<Custom Action="SetCustomAction_EncryptKey"
Before="CostFinalize"/>
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="CustomAction_EncryptKey"
Before="CostFinalize"/>
</InstallExecuteSequence>
无论如何,我发现ORCA是一个工具,可以揭开整个&#34;什么时候安排自定义动作&#34;。