.net 未安装Windows服务时,ServiceController.ServiceName不会引发InvalidOperationException异常

k97glaaz  于 2023-01-03  发布在  .NET
关注(0)|答案(3)|浏览(147)

根据这里的文档: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属性何时抛出异常。

wxclj1h5

wxclj1h51#

您需要使用带string参数的构造函数来创建(尝试创建)与现有服务的链接。
初始化与本地计算机上的现有服务关联的ServiceController类的新示例。
如果服务不存在,构造函数将不会抛出异常,但是访问ServiceName属性get将抛出异常,如文档所述。
下面的示例将引发该异常。

var serviceController = new ServiceController("Not.Existing.Service");
var serviceName = serviceController.ServiceName;  // << Exception thrown.
eoxn13cs

eoxn13cs2#

如果你查看source code here,你会看到这个异常是什么时候抛出的。ServiceController有几个机会在服务名称上抛出这个异常。具体来说,查看private void GenerateNames()定义。这个函数只在ServiceNameDisplayName的getter中调用,这就是你可能遇到这个异常的时候。

czfnxgou

czfnxgou3#

如果您阅读这段代码,它清楚地提到,它不会在ServiceControllerServiceName的setter上抛出无效服务名的异常(它只进行验证检查

相关问题