2014-05-09 68 views
1

我正在執行WIX MSI slient安裝,並且還有一些自定義操作檢查兩者之間是否存在未能如何回滾或結束msi的簡單安裝過程? ?我正在複製文件,並使用Wix安裝啓動Windows服務。當以前的customaction失敗,我可以如何停止創建目錄和啓動windows服務?Wix靜默安裝MSI可以阻止目錄的創建

[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> 
+0

我個人發現,讓整個安裝失敗並回滾最簡單,然後嘗試排除故障並修復自定義操作導致其失敗的問題。現在,如果您正在檢查先決條件,也許可以爲需要先決條件的組件創建功能,如果它們不符合先決條件,請將其禁用。 – jcmcbeth

回答

3

安裝順序分爲兩個主要階段;即時和推遲。如果發生錯誤,將安裝分爲兩個階段(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的整體概念的更多信息。它有很多例子和案例,包括上面的例子。

+3

這似乎主要是從尼克拉米雷斯書的文本中「借來的」 - 如果能給他一些功勞或推薦「Windows安裝程序Xml開發人員指南」這本書,那就好了。 – PhilDW

+0

是真的,我記住了這一點,但不知何故忘了添加它;感謝您的提醒! – mcy