根据这里的文档:https://learn.microsoft.com/en-us/dotnet/api/system.serviceprocess.servicecontroller.servicename?view=dotnet-plat-ext-7.0#exceptions
如果“未找到服务”,ServiceController.ServiceName
将抛出InvalidOperationException
。
但是运行这段代码时,它不会抛出异常:
var serviceController = new ServiceController();
serviceController.ServiceName = "Not.Existing.Service";
我个人不相信在设置ServiceName
时(在创建ServiceControler
对象时)会发生这种服务状态检查,但是文档并不清楚异常是在什么时候准确地在这个属性上抛出的。
也有可能在从ServiceName
获取值时引发异常,我尝试了以下场景:
1.已安装服务
1.已运行代码(如下)
1.已暂停第3行的调试器
1.已卸载服务
1.继续运行代码
没有发生异常!
/*1*/ serviceController.ServiceName = "Existing.Service";
/*2*/ serviceController.Start();
/*3*/ var serviceName = serviceController.ServiceName;
我还发现了其他问题(this one),在检查是否安装了Windows服务时,没有一个答案提到这个属性。
注意:我的问题不是试图弄清楚如何检查是否安装了Windows服务,而是要了解ServiceName
属性何时抛出异常。
3条答案
按热度按时间wxclj1h51#
您需要使用带
string
参数的构造函数来创建(尝试创建)与现有服务的链接。初始化与本地计算机上的现有服务关联的ServiceController类的新示例。
如果服务不存在,构造函数将不会抛出异常,但是访问
ServiceName
属性get
将抛出异常,如文档所述。下面的示例将引发该异常。
eoxn13cs2#
如果你查看source code here,你会看到这个异常是什么时候抛出的。ServiceController有几个机会在服务名称上抛出这个异常。具体来说,查看
private void GenerateNames()
定义。这个函数只在ServiceName
和DisplayName
的getter中调用,这就是你可能遇到这个异常的时候。czfnxgou3#
如果您阅读这段代码,它清楚地提到,它不会在
ServiceController
的ServiceName
的setter上抛出无效服务名的异常(它只进行验证检查