看看documentation,似乎Windows在两种情况下使用它:
ServiceBase.ServiceName需要与安装时的名称相同,但是在启动我的服务时,我可以调用ServiceBase.Run()而无需指定服务名称或完全指定不同的服务名称。我的应用程序仍然正确启动我正在使用一个单独的WiX项目来安装我的服务,并根据一些TRANSFORMS在那里定义服务名称。
Windows使用ServiceBase.ServiceName指定EventLog.Source。我成功地能够使用Log4Net的EventLogAppender登录到EventLog,在我的log4net配置中手动指定applicationName。
我想确保在未正确指定ServiceName的情况下,我不会遇到任何影响,但我目前能够将所有典型用例命中为是。在调用ServiceBase.Run()之后,如果有任何其他需求,我可以使用System.Management to determine my service name。
我主要担心避免在这里设置服务名称是因为我的MSI安装程序可以通过TRANSFORMs安装我的exe的不同实例作为不同的服务我创建了一种鸡和蛋的问题我无法调用GetServiceName ()不调用ServiceBase.Run(),但我不能在不定义ServiceBase.ServiceName的情况下调用ServiceBase.Run()。
我正在运行的一些示例代码:
public aync Task<int> RunAsync()
{
var serviceToRun = new ServiceBase{/*ServiceName = "Avoiding.."*/};
var runServiceTask = Task.Run(() => ServiceBase.Run(serviceToRun));
logger.Warn($"ServiceName : '{GetServiceName()}'");
logger.Warn($"Service ShortName : '{serviceToRun.ServiceName}'");
await runServiceTask.ConfigureAwait(false);
return serviceToRun.ExitCode;
}
public string GetServiceName()
{
var processId = Process.GetCurrentProcess().Id;
var query = $"SELECT * FROM Win32_Service where ProcessId = {processId}";
var managementObject = new ManagementObjectSearcher(query).Get().Cast<ManagementObject>().FirstOrDefault();
if (managementObject == null)
{
throw new Exception("Could not get service name");
}
var serviceName = managementObject["Name"].ToString();
return serviceName;
}