2011-01-06 51 views
10

我們的產品具有MSI安裝程序(用WiX編寫),它基本上將一些文件複製到文件夾c:\ ourproduct中,並安裝Windows服務「ourwindowsservice」。安裝具有動態實例名稱的MSI的多個實例

我們希望添加對該服務的多個實例的支持,並且應該可以相互獨立地安裝/卸載它們。類似例如到SQL Server,每個實例都應該有一個可以作爲命令行參數傳遞給MSI的名稱。

示例: 實例 「A」=>將文件複製到目錄 「C:\ ourproductA」,安裝服務爲 「ourwindowsserviceA」 實例 「B」=>將文件複製到目錄 「C:\ ourproductB」,安裝服務爲「 ourwindowsserviceB「 ...

任何想法?

Instance transformation似乎需要預先定義和預先命名的一組實例。

謝謝

回答

9

ServiceInstall表的名稱列是格式化類型。這意味着您可以在運行時使用屬性來驅動名稱。

幾年前,我寫了一篇關於多實例安裝程序的博客文章。在有人問到關於動態數量的實例的評論中,我談論了需要做的事情。基本上你必須編寫一個bootstrapper.exe,它具有一個UI,並可以驅動創建具有獨特屬性的變換。使用C#和WiX/DTF進行MSI Interop實際上很有可能。我從來沒有覺得需要真正做到這一點。我對產品,產品-1 ...產品-15非常滿意,而且您已經完成。 ShortCuts必須通過自定義操作完成,因爲它們不支持格式化類型,但INSTALLDIR可以變形並且ServiceNames支持格式化。

+0

謝謝,克里斯托弗!您的博客文章是否仍然在線? – Max 2011-01-07 17:28:47

2

不幸的是,您提到的文章是正確的,Windows Installer不支持動態實例。即使支持多個實例的商業工具也需要從頭開始定義實例。所以在你的情況下,你需要在生成安裝程序之前手動定義實例A,B,C等。

這是因爲產品通過其ProductCode(等等)進行標識,所以您需要將變換應​​用於MSI,從而更改標識。由於您需要特殊工具或通常在用戶機器上找不到的Windows Installer API,因此很難生成轉換。然而,就像克里斯托弗提到的那樣,你可以嘗試使用安裝程序屬性模擬一個動態實例。這些屬性可以通過安裝UI或通過自定義引導程序來設置。