簡體   English   中英

在C#中將字符串轉換為當前區域性

[英]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.

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