ServiceController.ServiceName未按文档抛出InvalidOperationException的疑问
ServiceController.ServiceName抛出“服务未找到”异常的时机 首先明确:单纯设置或读取ServiceName属性本身,不会触发服务存在性检查,自然也不会抛出InvalidOperationException。你测试的两种场景(设置不存在的服务名、服务被卸载后读取ServiceName)都不会抛异常,就是因为这个原因——ServiceName本质上只是一个存储的字符串,设置和读取它不需要和系统服务管理器交互。
只有当你调用需要和实际服务进行交互的方法,或者访问依赖服务实际状态的属性时,才会触发服务存在性验证,此时如果服务不存在(或已被卸载),才会抛出“服务未找到”的InvalidOperationException。具体场景包括:
- 调用服务控制方法:
Start()、Stop()、Pause()、Continue()、Refresh()等 - 访问服务状态/信息属性:
Status、DisplayName、ServicesDependedOn、DependentServices等
举个例子,把你第二个测试的第3行改成:
var status = serviceController.Status;
当你卸载服务后继续运行,这行代码就会抛出“服务未找到”的异常——因为Status属性需要去系统服务管理器查询对应服务的状态,此时服务已不存在,验证失败触发异常。
微软文档里的描述确实存在歧义,它提到的“服务未找到时抛出异常”,并不是指设置或读取ServiceName属性的动作本身,而是指当使用该属性对应的服务进行实际交互操作时,才会触发的异常。
内容的提问来源于stack exchange,提问作者mshwf
相关产品推荐
相关产品推荐

