2011-12-09 129 views
1

我有一種情況,我被要求在Wix中重新實現InstallShield安裝程序。我在互聯網上嘗試實現確切行爲的例子有困難。我需要做的是以下幾點:Wix:註冊並啓動Windows服務

當用戶點擊VerifyReadyDlg安裝按鈕(我用盟)和ProgressDlg出現:

  • 呼叫在安裝位置的.exe文件(如果從先前存在的安裝)
  • 從以前的從以前的從MSI停止在安裝位置的服務(如果存在安裝)
  • 註銷上述服務(如果存在安裝)
  • 複製文件,其中包括要安裝位置的服務.exe的副本從以前的對話框一些編輯控件
  • 讀取數據並將數據寫入到一些目前處於安裝位置複製的.xml配置文件
  • 註冊服務再次

在單擊Finish(完成)在非常最後一個對話框(ExitDlg)按鈕,我需要:

  • 在安裝位置再次啓動該服務
  • 調用一個.exe(不同於第一個)

我可以複製文件並將它們複製後的文件寫入數據......雖然威克斯只是這樣做......我不告訴它什麼時候去做。問題是我需要安排第一次.exe調用,服務停止和取消註冊複製操作開始之前,我只能在更新.xml配置文件後再次註冊。

我一直在嘗試使用InstallExecuteSequence和ServiceInstall元素,並將它們與CustomActions綁定在一起,但它並沒有聚集在一起,我認爲我完全接近這個錯誤的方式......不值得發佈我所做的事情。

我應該怎麼辦?這是我在InstallSheild腳本中看到的一種常見模式,但我找不到任何執行此序列的Wix示例。

感謝一大堆幫忙。 Michael。

回答

0

您可以使用BeforeAfter屬性Custom element或標準操作的元素來控制何時安排您的操作。

是否使用MSI進行當前安裝?如果是,則在複製現有配置之後但在執行其他安裝操作之前,您可能想要執行升級安裝和計劃RemoveExistingProducts。這樣,以前的軟件包將使用其自己的卸載邏輯刪除,然後您可以安裝更新的軟件包。

要保存以前版本的配置,必須先執行RemoveExistingProducts之前的操作。

0

你可能希望創建使用自定義操作,你定義在C#中的一個項目,輸出到DLL文件:

public static class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult DoSomething(Session session) { 
     // Put C# code here that does what you describe, such as run an exe 
     // from the command prompt. 
     return ActionResult.Success; 
    } 
} 

導入這個DLL到您的維克斯安裝程序:

<!-- The custom action DLL itself.--> 
<Binary Id="WebAppCA" SourceFile="$(var.SolutionDir)..\WebAppInstallCustomActions\bin\Debug\WebAppInstallCustomActions.CA.dll" /> 

<!-- The custom action that does something that you can use. --> 
<CustomAction Id="DoSomething" 
        BinaryKey="WebAppCA" 
        DllEntry="DoSomething" 
        Execute="immediate" 
        Return="check" /> 

如果您想查看完整的解決方案,請參閱John Robbins的博客(link)上的此主題...他有一個Wix安裝程序,它安裝IIS站點,但是當您啓動它時,它會使用C#中定義的自定義操作來枚舉網站列表。