2009-07-20 105 views
1

我正在使用VS 2008安裝和部署項目來部署混合託管/非託管應用程序。我在使用內建註冊屬性(「vsdraCOM」枚舉「Register」屬性的值)註冊混合模式DLL時遇到了問題。作爲解決方法,我添加了一個.NET自定義安裝程序集(帶有一個類派生自System.Configuration.Install.Installer。)我確定該類正在運行,並且一些操作已成功安裝並通過該程序集中的代碼進行卸載,包括執行多個程序集的Dll(Un)RegisterServer入口點。在運行.NET自定義操作之前強制安裝GAC?

但是,一個DLL沒有成功註冊。它是唯一依賴於想要安裝到GAC的第三方可再發行組件程序集的DLL。我已經將這些程序集安裝到了GAC中,這要歸功於VS 2008的安裝和部署項目中的內置支持,而且我知道這是可行的。我已經確認,發生的情況是自定義操作在安裝程序執行GAC安裝之前正在執行。

噢。所以我的問題是,有沒有辦法強制安裝程序在執行自定義操作之前執行GAC安裝?有沒有辦法使用自定義操作的「條件」屬性來做到這一點?如果不是,我最好的選擇是什麼?從DLL中捕獲註冊表項並將它們添加到安裝程序的註冊表設置中(不要這樣做,因爲將來有人可能會向該類添加新的COM服務器)?使用.NET代碼手動將程序集安裝到GAC中(不知道如何執行此操作)?

感謝,

戴夫

回答

2

你可以在Visual Studio中創建的安裝項目是非常有限的。它只允許自定義動作安排在4點。但是,MSI允許自定義操作在流程中的任意位置進行安排,並對其可執行的操作進行一些限制。

我的第一個解決方案是停止使用Visual Studio 2008作爲安裝開發工具。 Visual Studio團隊試圖抽象出創建安裝的所有複雜性。然而,在這個過程中,他們也奪走了微星的全部靈活性。 Wix,InstallShield或Wise對於除簡單安裝以外的任何其他產品都是更好的產品。我開始使用Visual Studio進行安裝,結果工作太多。總有一個解決方案需要實施,其副作用需要處理。

如果您無法切換技術,那麼您需要了解如何手動修改生成的MSI文件。在你的情況下,你需要修改InstallExecuteSequence表,http://msdn.microsoft.com/en-us/library/aa369500(VS.85).aspx。您可以通過Orca,http://msdn.microsoft.com/en-us/library/aa370557(VS.85).aspx或通過MSI API http://msdn.microsoft.com/en-us/library/aa372860(VS.85).aspx手動執行此操作。確保下載Orca並針對您的安裝運行驗證腳本。這些腳本指出了很多問題,在部署到客戶機器時修復會爲您節省無數的時間。

+0

謝謝,我們確實使用installshield,但它會在生成計算機再次運行幾個星期之前,我需要儘快安裝。 MSI API解決方案聽起來很有前途。僅供參考,我發現System.EnterpriseServices.Internal.Publish.GACInstall()會在GAC中安裝一個任意程序集,但這並不理想,原因很多(「內部」,很少有錯誤檢查,對於回滾/卸載語義。) – 2009-07-20 17:33:03

相關問題