簡體   English   中英

當我安裝新版本的軟件時,如何消除“指定的服務已存在”?

[英]How do I eliminate “The specified service already exists” when I install new versions of my software?

我有一個VS2008應用程序,其中包括一個服務項目(我稱之為ServiceProject)。 我將安裝項目(InstallationProject)設置為RemovePreviousVersions。 此外, 為InstallationProject 設置自定義操作 ,從ServiceProject安裝,提交,回滾和卸載主輸出。

有時,當我構建新版本的安裝程序時,我可以安裝而不會出錯。 通常,當我到達設置服務的位置(在安裝程序中輸入用戶名和密碼)時 - 它會因錯誤“指定的服務已存在”而失敗。

我不知道為什么它不一致,雖然我認為可能有某種服務簽名,如果服務未經修改,它可以成功刪除它,但經過修改后,它無法識別服務。 但是,我很少對服務進行修改,所以我懷疑是這樣的。

如何在沒有此錯誤的情況下使安裝程序成功更新服務? 我的解決方法是手動進入控制面板,卸載以前的應用程序,然后運行安裝程序。

除了確保文件版本不同,StingyJack提到你有另一個問題。 來自VS文檔(抱歉,不在線)

如果已在應用程序的安裝項目中設置了安裝和卸載自定義操作,並且已在Visual Studio 2005中啟用了RemovePreviousVersions屬性,則在升級期間將卸載以前版本的產品。 但是,此行為在Visual Studio 2008中更改如下:

在Visual Studio 2005中,從v1.0.0升級到v1.0.1時,自定義操作的調用如下:

v1.0.0自定義操作卸載()

v1.0.1自定義操作Install()

在Visual Studio 2008中,未調用卸載操作,如下所示:

v1.0.1自定義操作Install()

如果您依賴於舊行為創建了自定義操作,則需要修改新行為的代碼。 此行為更改僅影響更新,而不影響卸載。

因此,您正在使用自定義操作安裝服務 - 但是在升級時,未按預期調用卸載部件,並且您嘗試在現有的正在運行的版本上進行安裝。

認為當它要求重啟時,因為它無法在運行時更新服務文件。

兩種選擇: -

將代碼添加到“安裝/提交”自定義操作以停止服務,等待安裝程序更換服務文件,然后重新啟動服務。 請參閱PonalSuper3在此主題中的答案

通過使用Orca將InstallExecuteSequence.RemoveExistingProducts更改為緊隨其后的.InstallInitialize - 通常將.RemoveExistingProducts設置為1525, 將VS2008的行為恢復到它在VS2005中的工作方式 (在新版本安裝之前調用舊版本卸載自定義操作)但請檢查您的個人MSI。

我添加了一個腳本,而不是添加到構建過程中以更改MSI的InstallExecuteSequence

將“Not(已安裝或PREVIOUSVERSIONSINSTALLED)”放入“自定義操作” - >“安裝條件”屬性中。

部署每個新安裝程序包時,請確保更改服務的程序集版本和GUID(在AssemblyInfo.vb / cs中)。 如果它檢測到相同版本,則更新失敗。

可能有所幫助,但上述任何與Ryan的答案無關的內容都沒有說明。 在我這樣做之前,同樣的問題發生在我身上:在Orca中打開.msi並找到升級表。 如果previousversion安裝的行(是我的第一個條目)是,您應該看到升級代碼。 找到當前安裝的程序的.msi(要升級的程序),找到升級代碼(可以在orca中執行),然后將其復制並粘貼到新的.msi的升級表中。 這對我有用。

在安裝程序類中嘗試此代碼。 我希望它能解決你的問題。

protected override void OnBeforeInstall(IDictionary savedState)
        {
            if (LaunchOnBeforeInstall())
            {
                base.OnBeforeInstall(savedState);
            }
            else
            {
                throw new Exception("You cancelled installation");
            }
        }
        public bool LaunchOnBeforeInstall()
        {
            Form2 frm2 = new Form2();
            DialogResult result = frm2.ShowDialog();
            if (result == DialogResult.Cancel)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

並且還說“NOTPREVIOUSVERSIONSINSTALLED” 正如Trail Image中的SJown

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM