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