檢測程式碼是否作為服務執行
.NET 庫有沒有辦法檢測它是否作為服務執行?
我的圖書館可以以任何一種方式執行。但是當它作為服務執行時,開發人員需要呼叫一個額外的方法來指示事實或某些功能將無法正常工作。我希望處理日誌記錄的庫在未呼叫該方法的情況下在服務中使用時寫入警告。
您可以添加Microsoft.Extensions.Hosting.WindowsServices NuGet 包並使用
WindowsServiceHelpers.IsWindowsService()幫助程序方法。對於 Linux,您可以使用Microsoft.Extensions.Hosting.Systemd和
SystemdHelpers.IsSystemdService()方法。
在通過智能感知、調試器和文件進行大量搜尋之後,我們無法找到任何嚴格可靠的東西。獲取目前程序 ID 並嘗試確定該程序是否已向 SCM 註冊是可能的,但是雖然 .NET 提供了一種獲取所有服務集合的方法,但它們的程序 ID 不在可用資訊中。將程序名稱與服務名稱進行比較是可能的,但不一定可靠。
但是,有兩件事相對容易檢查,可能足以滿足您的需要,如果不完全是“此程式碼作為服務執行嗎?”
[System.Environment.UserInteractive](http://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx):(正如斯蒂芬馬丁所指出的)如果這是真的,那它就不可能是一項服務。大多數不是服務(也不是設備驅動程序)的程序都會說是真的。某些控制台應用程序在非互動式環境(例如建構過程的一部分)中執行時可能會顯示為 false。
[System.Diagnostics.Process.GetCurrentProcess](http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getcurrentprocess.aspx)().[SessionId](http://msdn.microsoft.com/en-us/library/system.diagnostics.process.sessionid.aspx): (我認為這與 Pierre 得到的相同)如果這不是 0,則它不是作為服務啟動的。大多數正常的應用程序不會在會話 0 中(如 Pierre 和 Stephen 所述,有一些不那麼正常的例外情況)。最大的問題是它在 XP 或更早版本等舊作業系統下的表現如何。XP 和 Windows 2000 顯然在會話 0 中執行服務,但普通應用程序也將在會話 0 中執行。XP 的某些配置(例如,不在域中)允許同時多個使用者會話,並且每個使用者都獲得不同的會話 id,但第一個獲得會話 0。因此,在 Vista 之前進行檢查並不有效。因此,根據您實際需要區分的內容,這些檢查中的一項或兩項可能對您有用。