1

我讀過關於MSI安裝的每一個計算器文章一個服務,但我無法找到解決我的問題:VS安裝項目 - 安裝組件到GAC並開始使用它們都在同一個安裝

我有一個有5個項目,VS2010解決方案的所有目標.NET 2.0:

  • DLL A,沒有項目引用
  • DLL B,引用DLL
  • Windows窗體應用程序,引用的DLL乙
  • Windows服務,引用的DLL乙
  • 安裝項目

DLL A和DLL B被設置爲被安裝到GAC在安裝時。我想在安裝完成後啓動服務,但根據我讀過的內容,程序集只有在最後一步纔會註冊。我已經試圖開始在我的ServiceInstaller類的AfterInstall事件服務證明了這一點,我得到以下錯誤:

Error 1001. Could not load file or assembly 'DLL_B', version 1.0.0.1, Culture=neutral, PublicKeyToken=5e297270603814f4' or one of its dependencies. The system could not find the file specified.

但當然,一旦安裝完成後,我可以手動啓動該服務,它運行精細。另外,在Windows XP中,我通常可以在應用程序啓動時啓動服務(我有一個Launch Application複選框作爲安裝程序的最後一步)。但是在Windows 7中,當時不再提升權限,並且啓動服務會引發錯誤。

如何在不強制重啓的情況下實現服務的安裝和啓動?引用我的客戶:「現在2011年,這不應該是必要的。」,我非常同意。

提前致謝。

回答

1

解決方案是使用在InstallExecuteSequence表中的InstallFinalize後運行的自定義操作。此自定義操作應使用msidbCustomActionTypeAsync and msidbCustomActionTypeContinue標誌,以便在安裝完成後在單獨的進程中運行。

這不能與一個Visual Studio安裝項目來完成,但也有很多的替代品:Orca,維克斯,商業設置創作工具等

+0

在InstallFinalize之後計劃的任何CA都不具有提升的權限。如果UAC關閉,這可能會起作用,但這不是一個好習慣,IMO。 – 2011-04-14 12:06:32

+1

這是真的。但是可以通過提升安裝程序UI(例如使用引導程序)或使用請求提升的應用程序清單的EXE自定義操作輕鬆避免。 – 2011-04-14 12:12:14

+0

我標記了Cosmin的答案是正確的,因爲它是最接近的,只是因爲他說的這部分「這不能用VS設置項目來完成,但有很多選擇。」我選擇使用InnoSetup。我發現它非常簡單,而且對我的需求來說是完美無缺的。安裝程序尖叫得很快,完全符合我需要的。 – 2011-04-14 14:44:48

2

這是一個衆所周知的問題,與GAC。一種選擇可能是使用兩個單獨的安裝程序並將它們菊花鏈連接起來。這是我們選擇解決在Vista和更高版本上部署Microsoft VC運行時的問題的方式。如果使用合併模塊,則依賴於它們的任何服務都不會啓動。因此,實際上,將運行GAC的組件放入預安裝程序中,在安裝和啓動依賴於它們的服務之前,您的事務將完成並提交。醜陋的,我知道,但比重啓更好。

1

我的解決方案稍有不同:我不僅在GAC中安裝了我的程序集,而且還在應用程序文件夾中安裝了程序集。我的GAC綁定程序集已經作爲依賴關係被發現,所以我將這些程序集放入GAC中(並且只有在執行完所有自定義步驟後,那些程序纔會在那裏結束)。我還將相同的程序集作爲主輸出添加到應用程序文件夾中,其中帶有自定義操作的InstallHelper DLL也駐留在此處。這種方式在安裝期間使用來自應用程序文件夾的本地副本。

相關問題