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