2012-08-07 37 views
0

我想部署一個提供Web服務並能夠多次啓動它(每個都作爲單獨的Windows服務)的exe文件。 exe的每個實例都需要能夠加載不同的配置文件(例如,它可以偵聽不同的端口或使用不同的數據庫)。如何在服務啓動期間找到我的服務名稱exe

理想情況下,我不想在多個文件夾中安裝exe,只需要有多個配置文件。

但是,似乎沒有找到Windows啓動的服務名稱的方法。

我已經看過 How can a Windows Service determine its ServiceName? 但它似乎並沒有爲我工作,因爲在啓動過程中ID爲正在啓動該服務是0

我想我得太早什麼要求。我的代碼執行以下操作:

主要設置當前目錄並構造一個WebService對象(ServiceBase的子類)

WebService對象構造函數現在需要設置其ServiceName屬性,並使用代碼How can a Windows Service determine its ServiceName?嘗試找到正確的名字。但是,此時正確servicename的processid仍爲0.

接下來,Main將構建一個包含WebService對象的ServiceBase數組,並在該數組上調用ServiceBase.Run。服務名稱在此之前需要正確,因爲服務運行後可能不會更改。

回答

0

我找到了一種替代的方式來實現我的目標,閱讀https://stackoverflow.com/a/7981644/862344

在web服務的安裝後,安裝程序(這恰好是同一個程序,但與命令行參數「安裝「)知道使用哪個設置文件(因爲有一個命令行參數」settings =「)。

鏈接的問題顯示,通過重寫Installer類的OnBeforeInstall(和OnBeforeUninstall)方法,可以通過一種簡單的方法來獲取每次啓動時傳遞給服務的命令行參數。

protected override void OnBeforeInstall(System.Collections.IDictionary savedState) { 
    if (HasCommandParameter("settings")) { 
     // NB: Framework will surround this value with quotes when storing in registry 
     Context.Parameters["assemblypath"] += "\" \"settings=" + CommandParameter("settings"); 
    } 
    base.OnBeforeInstall(savedState); 
} 

protected override void OnBeforeUninstall(System.Collections.IDictionary savedState) { 
    if (HasCommandParameter("settings")) { 
     // NB: Framework will surround this value with quotes when storing in registry 
     Context.Parameters["assemblypath"] += "\" \"settings=" + CommandParameter("settings"); 
    } 
    base.OnBeforeUninstall(savedState); 
} 

我發現,一些在框架包圍Context.Parameters [ 「assemblypath」]值與註冊表中(存儲在它HKLM \ System之前報價\ CURRENTCONTROLSET \服務\\的ImagePath ),因此有必要在現有值(這是exe路徑)和參數之間添加'「,」「。