【问题标题】:C# ServiceController not finding service when lookup uses parameter instead of hardcoded string当查找使用参数而不是硬编码字符串时,C#ServiceController 找不到服务
【发布时间】:2017-09-28 07:44:55
【问题描述】:

我在查找在本地计算机上运行的服务时遇到了一些问题,但只有当我使用参数字符串而不是硬编码字符串(我添加它以调试问题)时。

我的方法是这样的:

public bool CheckIfServiceIsRunning(string serviceName)
{
    try
    {
        var services = ServiceController.GetServices();
        var service = services.FirstOrDefault(s => s.DisplayName == serviceName);
        var test = services.FirstOrDefault(s => s.DisplayName == "MongoDB");
        if (service == null)
        {
            return false;
        }
        return service.Status.Equals(ServiceControllerStatus.Running);
    }
    catch (InvalidOperationException ex)
    {
        Log.Info(ex.Message);
        throw new InvalidOperationException(ex.Message);
    }
}

使用参数“MongoDB”运行此代码的结果:

服务 = null

test = System.ServiceProcess.ServiceController 对象与 MongoDB 服务

编辑: 使用以下比较告诉我字符串不相等:

if (string.Compare(serviceName, "MongoDB", StringComparison.Ordinal) == 0)
{
    Console.WriteLine("same string");
}

【问题讨论】:

  • 你试过 string.Compare() 吗?并最终添加字符串比较不变的文化?对我来说似乎一样..我现在想知道有什么区别..String.Compare Method (String, String, CultureInfo, CompareOptions)
  • 在执行 serviceName.Equals() 以查看它是否匹配“MongoDB”(具有不变的文化)时,它不相等。
  • 那很好.. :D 但是如果你只是比较忽略文化也许会起作用?
  • 也可以参考Difference between InvariantCulture and Ordinal string comparison这是为了安全起见我通常比较字符串的方式
  • 也许可以尝试使用 serviceName.Trim()。您解析的参数有问题,请仔细查看您在方法中实际放入的内容。该方法本身看起来不错。在方法中设置断点并检查字符串方法获取的内容。

标签: c# .net service servicecontroller


【解决方案1】:

方法本身看起来不错,你解析的参数有问题,好好看看你实际上在方法中放入了什么。尝试使用serviceName.Trim(),字符串之前和/或之后的空白字符可能会变得棘手。

您还可以在方法中设置断点并检查 serviceName 包含的确切内容。

【讨论】:

  • '-.- 我不敢相信问题出在空格上,因为......如果我要搜索的话,那将是第一个地方......
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2021-03-14
相关资源
最近更新 更多