2013-03-19 120 views
4

我在使用Wix卸載服務時只能運行自定義操作時遇到問題。僅在卸載時使用Wix自定義操作

<CustomAction Id='InstallService' 
       FileKey='Service.exe' 
       ExeCommand='install' 
       Execute='immediate' 
       Return='check' 
       Impersonate='yes'>NOT Installed</CustomAction> 

<CustomAction Id='UninstallService' 
       FileKey='Service.exe' 
       ExeCommand='uninstall' 
       Execute='immediate' 
       Return='check' 
       Impersonate='yes'>Installed AND NOT REINSTALL</CustomAction> 

<InstallExecuteSequence> 
    <Custom Action='UninstallService' After='StopServices'/> 
    <Custom Action='InstallService' Before='StartServices'/> 
</InstallExecuteSequence> 

這是組件...

<Component Id="ProductComponent"> 
    <File Id="MyService.exe" 
      Name="MyService.exe" 
      Source="..\MyService\bin\Release\MyService.exe" 
      Vital="yes" 
      KeyPath="yes" 
      DiskId="1"/> 

    ... 

    <ServiceControl Id='ServiceControl' 
        Name='MyService' 
        Start='install' 
        Stop='both'/> 
    </Component> 

當我運行安裝程序,我得到一個錯誤。查看事件日誌,我發現這...

產品:MyService - 錯誤1721.此Windows安裝程序包存在問題。此安裝完成所需的程序無法運行。聯繫您的支持人員或軟件包供應商。行動:UninstallService,位置:C:\ Program Files文件(x86)的\爲MyService \ MyService.exe,命令:卸載

我也曾經嘗試這樣做...

<CustomAction Id='UninstallService' 
       FileKey='Service.exe' 
       ExeCommand='uninstall' 
       Execute='immediate' 
       Return='check' 
       Impersonate='yes'>Installed AND NOT UPGRADINGPRODUCTCODE</CustomAction> 

注:我使用的自定義操作安裝/卸載服務,因爲我使用了TopShelf.NET

回答

4

最好的辦法是將自定義操作的操作綁定到組件的操作狀態。

<InstallExecuteSequence> 
    <Custom Action="UninstallService">$ProductComponent=2</Custom> 
    <Custom Action="InstallService">$ProductComponent=3</Custom> 
</InstallExecuteSequence> 

而且,你會需要你的CustomAction元素是Execute='deferred'

此外,CustomAction元素中的文本僅在您創建腳本自定義操作時才被允許。這看起來不像你在做什麼。

添加自定義操作需要相當多的理解。不幸的是,第三方平臺force you to use custom actions

+0

輝煌,感謝指引我在正確的方向。我實際上最終使用了?ProductComponent = 3進行卸載,$ ProductComponent = 3進行安裝,現在完美運行。 – 2013-03-20 09:07:11

+1

使用?ProductComponent = 3意味着即使組件未被刪除,卸載也會觸發。例如,在修復期間,我希望您的卸載自定義操作將被調用。可能不是目標。 :) – 2013-03-20 14:01:01

+0

當我嘗試$ ProductComponent = 2是行不通的。所以我搜索了一下,發現了?限定符 – 2013-03-20 15:47:40