Wix静默安装MSI我们可以停止创建目录吗

Posted

技术标签:

【中文标题】Wix静默安装MSI我们可以停止创建目录吗【英文标题】:Wix silent installation of MSI can we stop creation of directory 【发布时间】:2014-05-09 03:21:54 【问题描述】:

我正在做 WIX MSI 静默安装,如果自定义操作失败,还有一些自定义操作在检查之间如何回滚或结束 msi 的静默安装过程??我正在复制文件并使用启动 Windows 服务Wix 安装。当自定义操作失败时,我如何停止创建目录和启动 Windows 服务??

    [CustomAction]
    public static ActionResult PrerequisiteCheck(Session session)
    

                if (Status.IsServiceAvailable && Status.IsPrinter)
                
                    return ActionResult.Success;
                
                else
                
                        //Stop Installer
                     return ActionResult.Failure;
                
    

<CustomAction Id="CheckPrerequiste" BinaryKey="BIN_CustomAction" DllEntry="CheckPrerequiste" Return="ignore" Execute="immediate" />

<InstallExecuteSequence> <Custom Action="CA_PrerequisiteCheck" After="InstallExecute" >  </Custom>
</InstallExecuteSequence>

<Directory Id="TARGETDIR"  Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="Service">
<Component Id="WindowsService" Guid="AA34D3C1-26F1-4A7E-A226-1AB01501C67C">
<File Id="00690A65EA1A3EFEB7607285DBA0C8C5" KeyPath="yes" Source="WindowsService.Svc.exe" />
<ServiceInstall Id="Service" Name="Service"   DisplayName="Windows Service" Description="Windows Service" Start="auto" ErrorControl="normal" Type="ownProcess" />
<ServiceControl Id="sc_Service" Name="Service" Stop="both" Remove="uninstall"  Wait="yes" />
<Component Id="WindowsSvcexe" Guid="06ABF18B-DEDE-4D98-AF9F-8384539A6BC3"> <File Id="49215CE1A25380930C771772AD14519B" KeyPath="yes" Source="WindowsService.Svc.exe.config" /> </Component> </Component> 
</Directory> 
</Directory> 
</Directory>

【问题讨论】:

我个人认为让整个安装失败并回滚然后尝试排除故障并修复导致其失败的自定义操作的问题是最简单的。现在,如果您正在检查先决条件,也许您可​​以为需要先决条件的组件创建一个功能,并在它们不满足先决条件时禁用它。 【参考方案1】:

安装顺序分为两个主要阶段;即时和延期。将安装分为两个阶段(UI 和执行)的主要原因是在发生错误时提供回滚。在执行阶段,InstallInitializeInstallFinalize 之间的所有操作都包含在回滚中,称为延迟阶段。正在准备回滚脚本但尚未启动回滚保护的初始阶段称为立即阶段。 UI 序列没有任何回滚功能,因此改变系统的操作永远不应该在那里发生。 进行系统更改的自定义操作应标记为deferred,并应计划在执行阶段在InstallInitializeInstallFinalize 之间运行。开发人员应为自定义操作提供回滚操作:

… 
<CustomAction Id=”myaction” Execute=”deferred” Return=”check” />
…
<InstallUISequence>
    <Custom Action=”myaction” After=”CostFinalize” />
    <Custom Action=”myaction2” After=”myaction” />
</InstallUISequence> 
<InstallExecuteSequence>
    <Custom Action=”myaction3” After=”InstallInitialize” />
    <Custom Action=”myaction4” After=”myaction3” />
</InstallExecuteSequence>

延迟的自定义操作在执行序列的回滚保护阶段执行。要为这些操作提供回滚功能,应编写单独的撤消工作的自定义操作。 回滚操作安排在发生错误时要恢复的操作之前:

<CustomAction Id="systemChangingCA" Execute="deferred" Script="vbscript">
    msgbox "Your system has been changed"
</CustomAction>

<CustomAction Id="rollbackSystemChangingCA" Execute="rollback" Script="vbscript">
    msgbox "System changes are undone"
</CustomAction>

<CustomAction Id="causeError" Execute="deferred" Script="vbscript">
    Err.Raise 507
</CustomAction>

这些计划如下:

<InstallExecuteSequence>
    <Custom Action="rollbackSystemChangingCA" Before="systemChangingCA" />
    <Custom Action="systemChangingCA" After="InstallInitialize" />
    <Custom Action="causeError" After="systemChangingCA" />
</InstallExecuteSequence>

在本例中,systemChangingCA 将在InstallExecuteSequence 的延迟阶段运行。当causeError 之后运行时,会导致抛出异常,从而触发回滚。然后rollbackSystemChangingCA 运行。

Wix 工具集还提供了自己的自定义操作来刺激称为WixFailWhenDeferred 的回滚。它是WixUtilExtension 的一部分,您可以使用它来测试您的回滚方法。

由 WiX 自身创建的文件夹应在回滚期间自动删除。

您可以从 Nick Ramirez 的书:“Windows Installer XML 开发人员指南”中了解有关 Microsoft Installer 和 WiX 整体概念的更多信息。上面有很多例子和案例。

【讨论】:

这似乎主要是从 Nick Ramirez 书的文本中“借来的” - 给他一些荣誉或推荐“Windows Installer Xml 开发人员指南”一书会很好。 是的,我有这个想法,但不知何故忘记添加它;谢谢提醒!

以上是关于Wix静默安装MSI我们可以停止创建目录吗的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义 /a 参数的 WiX 引导程序静默安装

Wix刻录安装程序无法在静默安装时重新启动

MSI 软件包的静默安装

WiX 上的静默 .NET 框架

如何使用 Visual Studio 2008 创建静默安装程序包

如何在InstallShield项目中以静默方式安装msi文件