如何检查当前可执行文件是否已经绑定了 Windows 服务
How to check if the current executable already has a Windows service tied to it
我有一个用户可以下载的 C# 控制台应用程序。当他们 运行 并设置程序时,它会安装一个 Windows 服务,然后处理 运行 程序。我希望用户能够多次下载此应用程序,并为每个下载的程序创建一个 Windows 服务。我可以通过确保程序为服务提供唯一名称来允许这样做(否则会抛出异常,说明该服务已经存在)。
但是,我不希望用户能够 运行 多次下载可执行文件的同一实例并一遍又一遍地安装该服务。每个下载的可执行文件只有一项服务(即每个 bin 目录一个,即使可执行文件相同)。
在尝试安装该服务之前,我想检查 运行ning 的特定可执行文件是否已经绑定了一个 Windows 服务,在这种情况下我不会继续安装另一个。请注意,它必须是比可执行文件名称更彻底的检查,因为用户下载的所有程序都将具有相同的名称。由于每个可执行文件都位于不同的 bin 目录中,是否可以检查目录路径?
另一种选择是检查 Windows 服务的名称。问题是知道要检查什么名称。如果我将服务名称硬编码为 "MyService" 之类的名称,则根本无法创建多个服务。如果我通过执行 "MyService" + Guid.NewGuid()
之类的操作使服务名称唯一,那么每次相同的可执行文件为 运行 时该名称都将是唯一的,因此我将无法以这种方式检查它。我能想到的使每个 bin 目录的服务名称唯一的唯一方法是在名称中包含有关 bin 目录的内容,例如对目录路径进行 base64 编码。但是,如果移动 bin 文件夹,这可能会导致问题。
一个简单的解决方案是使用互斥体。类似于如何防止 .exe
的多个实例
当然这需要服务 运行ning。您可以通过 C# 查询已安装的服务:
ServiceController[] services = ServiceController.GetServices();
或者您始终可以 运行 'regsvr32' 和 parse/review 输出。
或者您在服务中嵌入命名管道 WCF 服务:
WCF named pipe minimal example
多种选择
我有一个用户可以下载的 C# 控制台应用程序。当他们 运行 并设置程序时,它会安装一个 Windows 服务,然后处理 运行 程序。我希望用户能够多次下载此应用程序,并为每个下载的程序创建一个 Windows 服务。我可以通过确保程序为服务提供唯一名称来允许这样做(否则会抛出异常,说明该服务已经存在)。
但是,我不希望用户能够 运行 多次下载可执行文件的同一实例并一遍又一遍地安装该服务。每个下载的可执行文件只有一项服务(即每个 bin 目录一个,即使可执行文件相同)。
在尝试安装该服务之前,我想检查 运行ning 的特定可执行文件是否已经绑定了一个 Windows 服务,在这种情况下我不会继续安装另一个。请注意,它必须是比可执行文件名称更彻底的检查,因为用户下载的所有程序都将具有相同的名称。由于每个可执行文件都位于不同的 bin 目录中,是否可以检查目录路径?
另一种选择是检查 Windows 服务的名称。问题是知道要检查什么名称。如果我将服务名称硬编码为 "MyService" 之类的名称,则根本无法创建多个服务。如果我通过执行 "MyService" + Guid.NewGuid()
之类的操作使服务名称唯一,那么每次相同的可执行文件为 运行 时该名称都将是唯一的,因此我将无法以这种方式检查它。我能想到的使每个 bin 目录的服务名称唯一的唯一方法是在名称中包含有关 bin 目录的内容,例如对目录路径进行 base64 编码。但是,如果移动 bin 文件夹,这可能会导致问题。
一个简单的解决方案是使用互斥体。类似于如何防止 .exe
的多个实例当然这需要服务 运行ning。您可以通过 C# 查询已安装的服务:
ServiceController[] services = ServiceController.GetServices();
或者您始终可以 运行 'regsvr32' 和 parse/review 输出。
或者您在服务中嵌入命名管道 WCF 服务:
WCF named pipe minimal example
多种选择