2010-06-07 165 views
2

我無法弄清楚在啓動時如何將(常量)參數傳遞到我的Windows服務中。我使用的是標準的.NET類,如ServiceBase來實現(和ServiceProcessInstaller和ServiceInstaller來安裝)我的服務。Windows服務 - 在「可執行文件路徑」中提供參數

在Windows服務屬性對話框(一旦安裝)的常規選項卡中,有一個「路徑可執行文件」中,我可以看到,一些標準的Windows服務的指定命令行參數。 System.ServiceProcess.ServiceBase.OnStart需要string[] args,我推測這些參數可以從.NET代碼中訪問。

有沒有對ServiceProcessInstaller或的ServiceInstaller一些屬性,我可以設置爲允許我啓動參數傳遞給我自己的服務,或沒有人知道它是如何應該做?

回答

1

當用戶使用命令行中的sc.exe start命令手動啓動服務時,會提供OnStart()參數。或者可以用ServiceControl.Start(string [])方法重載以編程方式完成。這很少用,你可能希望你的服務自動啓動而不需要用戶登錄。

是的,ImagePath的註冊表項不支持傳遞參數給.exe文件,你會通過主(字符串[])入口點得到它們。不幸的是,ServiceInstaller不支持這一點。更好的方法是使用註冊表。在您的安裝程序中,創建HKLM \ System \ CurrentControlSet \ services \ yourServiceName \ Parameters鍵並向其中寫入值。並將它們讀回到您的服務的Main或OnStart方法中。

+0

謝謝。安裝項目中的註冊表視圖對我來說有點笨拙。我嘗試使用派生自ServiceInstaller的自定義類,其中我重寫了Install方法,但基類在整個路徑中放置了引號,並使我試圖實現的內容失效。我想,如果我真的需要這樣做,這將需要一些想法......但我可能會找到另一種將值傳遞給服務的方式。 – Jono 2010-06-07 15:54:28

2

嗯,這是大約10個月後,你發佈和我有同樣的問題。一旦我閱讀了這個主題和其他主題,我就決定看看.NET Framework在幕後做了什麼,並且證實沒有文檔記錄的方式來做到這一點。有;然而,這是一個非常簡單的無證方式。在父安裝程序類中,覆蓋安裝方法或實現BeforeInstall事件。這並不重要,你可以使用以下方法之一:

public override void Install(System.Collections.IDictionary stateSaver) 
{ 
    base.Install(stateSaver); 

    base.Context.Parameters["assemblyPath"] = string.Format("\"{0}\" /service", base.Context.Parameters["assemblyPath"]); 
} 

或:

private void Installer_BeforeInstall(object sender, InstallEventArgs e) 
{ 
    base.Context.Parameters["assemblyPath"] = string.Format("\"{0}\" /service", base.Context.Parameters["assemblyPath"]); 
} 

的「assemblyPath」參數將與完整路徑可執行文件從AssemblyInstaller內進行初始化類。此參數的值寫入註冊表中的ImagePath值。如果不存在引號,則引號將放在該值的周圍,因此請確保將它們放在需要它們的位置(即至少在初始值附近)。在上面的行中,我將引號放在執行文件路徑的周圍,並將「/ service」作爲參數添加到末尾。

這將適用於所有使用該父安裝程序類的服務。如果您有不想添加參數或需要不同參數的服務,則可以嵌套安裝程序類並將代碼放在那些代碼上,而不是根安裝程序類。這沒有記錄在任何地方,將來可能會崩潰,並且可能無法在.NET Framework的非Microsoft版本上運行,但它目前確實有效。

我希望這會有所幫助。

相關問題