[英]Convert string to current culture in c#
我必須獲取“ Windows防火牆” Windows服務的實例,因為該實例正在使用
ServiceController service = new ServiceController("Windows Firewall");
這在美國文化中工作正常,但是當我嘗試在Windows Portuguese(巴西)pt-PT文化中做到這一點時,它將引發未找到服務的異常。
是的,在葡萄牙語中沒有“ Windows防火牆”,而沒有“防火牆Windows”,如果我按如下所示更改代碼
ServiceController service = new ServiceController("Firewall do Windows");
它會起作用,但僅適用於pt-PT文化。
有什么通用方法可以獲取“ Windows防火牆”實例,而不受區域性的影響?
沒有系統提供的功能來執行這種轉換。 您必須在自己的代碼中創建所有可能值的列表/字典,然后查找值。
ServiceController構造函數具有以下參數描述:
名稱
類型: System.String
標識系統服務的名稱。 這也可以是服務的顯示名稱。
換句話說:服務可以通過其語言不變的服務名稱或本地化的顯示名稱來標識。 您的代碼使用顯示名稱( Windows防火牆 )。 如果將其更改為使用服務名稱( MpsSvc ),則不會遇到本地化問題。
您可以通過計算機管理控制台(compmgmt.msc)查找服務的服務名稱和顯示名稱。 右鍵單擊服務,然后選擇“ 屬性”將顯示兩個名稱。
老實說,我只是了解Windows服務的顯示名稱可以是特定於文化的:-p
我完全同意戴維 。 最好創建自己的鍵/值列表。 另一方面, 可能有一些方法可以獲取您的特定於文化的顯示名稱。 警告! 我不是 100%肯定會一直有效!
代替顯示名稱,如何使用它的服務名稱並基於它獲取它的顯示名稱? 我認為這不是特定於文化的。 例如,使用ServiceController.GetServices
方法;
var displayName = ServiceController.GetServices()
.Where(s => s.ServiceName == "MpsSvc")
.Select(s => s.DisplayName)
.ToList()[0];
ServiceController sc = new ServiceController(displayName);
我在MpsSvc上搜索了一個小時,也許它可能用作另一個服務的名稱,但我找不到任何有關此的信息。
您也可以使用WMI來獲得它;
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service");
ManagementObjectCollection collection = searcher.Get();
var obj = collection.Cast<ManagementObject>()
.Where(o => o.Path.Path.Contains("MpsSvc"))
.ToList()[0];
string displayName = obj["DisplayName"].ToString();
ServiceController sc = new ServiceController(displayName);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.