在c#中将字符串转换为当前文化

时间:2015-05-12 06:36:28

标签: c# .net winforms winapi

我必须获得" Windows防火墙"的实例。 Windows服务,因为我正在使用

ServiceController service = new ServiceController("Windows Firewall");

这在en-US文化中运行良好,但是当我尝试在Windows葡萄牙语(巴西)pt-PT文化中尝试这样做时,它会抛出未找到的异常服务。

是的,在葡萄牙语中没有" Windows防火墙"相反"防火墙做Windows",如果我改变我的代码如下

ServiceController service = new ServiceController("Firewall do Windows"); 

它只会在pt-PT文化中发挥作用。

是否有任何通用方法,以获得" Windows防火墙"不管文化如何?

3 个答案:

答案 0 :(得分:3)

没有系统提供执行此类转换的功能。您必须在自己的代码中创建所有可能值的列表/字典,并查找该值。

答案 1 :(得分:1)

ServiceController Constructor具有以下参数说明:

  

名称

     

输入:System.String

     

标识系统服务的名称。这也可以是服务的显示名称。

换句话说:通过语言不变的服务名称或本地化的显示名称来识别服务。您的代码使用显示名称( Windows防火墙)。如果您将其更改为使用服务名称( MpsSvc ),则不会遇到本地化问题。

您可以通过计算机管理控制台(compmgmt.msc)查找服务的服务名称和显示名称。右键单击服务并选择属性将显示两个名称。

答案 2 :(得分:1)

老实说,我只是学习一个Windows服务的显示名称可以是特定于文化的:-p

我完全同意David。创建自己的键/值列表听起来是最佳选择。另一方面,可能是获取特定于文化的显示名称的一些方法。警告!我 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);