启动Windows服务时可以省略ServiceBase.ServiceName吗?

时间:2017-01-09 16:36:08

标签: c# .net windows service

看看documentation,似乎Windows在两种情况下使用它:

  1. ServiceBase.ServiceName需要与安装时的名称相同,但是在启动我的服务时,我可以调用ServiceBase.Run()而无需指定服务名称或完全指定不同的服务名称。我的应用程序仍然正确启动我正在使用一个单独的WiX项目来安装我的服务,并根据一些TRANSFORMS在那里定义服务名称。

  2. Windows使用ServiceBase.ServiceName指定EventLog.Source。我成功地能够使用Log4Net的EventLogAppender登录到EventLog,在我的log4net配置中手动指定applicationName。

  3. 我想确保在未正确指定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;
    }
    

0 个答案:

没有答案