Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows服务安装并在另一个服务内启动_C#_Windows Services - Fatal编程技术网

C# Windows服务安装并在另一个服务内启动

C# Windows服务安装并在另一个服务内启动,c#,windows-services,C#,Windows Services,我安装了一个主机应用程序作为win服务。此主机支持在自己的域中安装插件。已启用程序集卷影复制的域。从本质上讲,插件也是赢家服务。因此,在插件安装过程中,有以下几个阶段: 创建域,阴影加载插件的程序集 用依赖注入实例化插件的服务 执行服务安装 启动插件的服务 第三和第四阶段: public class ServiceCommander : MarshalByRefObject { public Exception InstallWinService() { var

我安装了一个主机应用程序作为win服务。此主机支持在自己的域中安装插件。已启用程序集卷影复制的域。从本质上讲,插件也是赢家服务。因此,在插件安装过程中,有以下几个阶段:

  • 创建域,阴影加载插件的程序集

  • 用依赖注入实例化插件的服务

  • 执行服务安装

  • 启动插件的服务

  • 第三和第四阶段:

    public class ServiceCommander : MarshalByRefObject
    {
        public Exception InstallWinService()
        {
            var assembly = service.GetType().Assembly;
            var account = AccountStore.GetAccount().Split(' ');
            var installer = new AssemblyInstaller(assembly, 
                new [] { $"/user={account[0]}", $"/password={account[1]}", $"/LogFile={TracksSinkHost.InstallLogPath}" });
            try
            {
                installer.UseNewContext = true;
                installer.Install(null);
                installer.Commit(null);
                return null;
            }
            catch (Exception ex)
            {
                installer.Rollback(null);
                return new Exception(ex.Message) { Source = ex.Source }; 
            }
        }
    
        public Exception StartWinService(bool ignoreManualStartType = false)
        {
            try
            {
                ServiceBase.Run(service);
                var serviceController = new ServiceController(service.ServiceName);
                if (serviceController.Status != ServiceControllerStatus.Running &&
                    (serviceController.StartType == ServiceStartMode.Automatic || ignoreManualStartType))
                    serviceController.Start();
                return null;
            }
            catch (Exception ex)
            {
                return new Exception(ex.Message) { Source = ex.Source };
            }
        }
    }
    
    其中服务对象是ServiceBase

    虽然所有阶段都成功了,但第四阶段却没有。serviceController.Start()立即抛出“由于以下错误,服务无法启动: 服务没有及时响应启动或控制请求。“我在系统事件日志中还看到”在等待服务连接时达到超时(30000毫秒)

    对我来说,服务控制管理器似乎找不到插件的入口点,所以我在插件的项目中提供了启动对象:

    static class Program
    {
        public static ServiceBase Service;
    
        static void Main(string[] args)
        {
            if (Service != null)
                ServiceBase.Run(Service);
        }
    }
    
    但梅因从未被处决


    如果手动启动插件的服务或者禁用子域上的卷影复制,我也会看到相同的事件日志。那么出什么问题了?

    从代码中,我猜它正在尝试启动正在启动的服务,因此导致异常

    要确认,请在
    StartWinService
    功能中记录
    serviceController.status
    的状态。我怀疑它当前是否是
    startpend
    ,因为您已经调用了
    ServiceBase.Run(service)

    如果正确,请尝试卸下serviceController部件


    说明:ServiceBase.Run()只需注册服务(又名:将其标记为启动),因此无法保证当您使用serviceController检查状态时,您的服务已经完成启动。

    从代码中,我猜它正在尝试启动正在启动的服务,因此会导致异常

    要确认,请在
    StartWinService
    功能中记录
    serviceController.status
    的状态。我怀疑它当前是否是
    startpend
    ,因为您已经调用了
    ServiceBase.Run(service)

    如果正确,请尝试卸下serviceController部件


    说明:ServiceBase.Run()只需注册服务(又名:将其标记为启动),因此无法保证当您使用serviceController检查状态时,您的服务已完成启动。

    新进程是否实际启动?(如果您不确定,Process Monitor可能是一个合适的故障排除工具。)新服务是如何配置的,例如,
    sc qc
    显示了什么?我不明白,为什么您已经有了“ServiceBase.Run(service)”,但又用ServiceController重新启动它?你想再次启动服务吗(当它启动时)?@HoángLong:好的,我没有注意到这一点
    ServiceBase.Run()
    在当前进程运行的服务停止之前不会返回,并且根本不能保证返回(进程可能会被终止),因此虽然我不确定OP试图做什么,但该代码肯定是错误的。我不确定您的总体目标是什么-您谈论的是卷影复制,但您知道,一旦服务注册,Windows将负责启动服务将来运行的进程,而当它这样做时,将不会创建带有卷影复制的应用程序域。@Damien_不相信者您绝对正确,我错过了windows在
    serviceController.Start()
    之后启动新进程,并希望它在我的引导程序进程内运行。新进程是否实际启动?(如果您不确定,Process Monitor可能是一个合适的故障排除工具。)新服务是如何配置的,例如,
    sc qc
    显示了什么?我不明白,为什么您已经有了“ServiceBase.Run(service)”,但又用ServiceController重新启动它?你想再次启动服务吗(当它启动时)?@HoángLong:好的,我没有注意到这一点
    ServiceBase.Run()
    在当前进程运行的服务停止之前不会返回,并且根本不能保证返回(进程可能会被终止),因此虽然我不确定OP试图做什么,但该代码肯定是错误的。我不确定您的总体目标是什么-您谈论的是卷影复制,但您知道,一旦服务注册,Windows将负责启动服务将来运行的进程,而当它这样做时,将不会创建带有卷影复制的应用程序域。@Damien_不相信者您绝对正确,我错过了windows在
    serviceController.Start()之后启动新进程,并希望它在我的引导程序进程内运行