猿问

将 Windows 服务作为依赖项添加到 .Net 应用程序

Windows 服务可以指定它依赖于另一个第二服务。当系统尝试启动(第一个)服务时,它会看到它依赖于第二个服务并首先启动它(第二个)。

可以为应用程序做同样的事情吗?我希望系统在我的应用程序启动时启动某个服务(如果它还没有启动)。

我不能只是从我的应用程序中调用它,因为我的应用程序在没有管理员权限的情况下运行,而服务作为本地系统运行。该服务已安装在计算机上。

(我知道我可以让系统自动启动服务。不幸的是, .net Services存在问题。它们只能通过延迟启动可靠地启动,并且我的应用程序需要立即可用。)


吃鸡游戏
浏览 211回答 2
2回答

摇曳的蔷薇

当您的应用程序启动时,只需检查服务是否已启动服务控制器类表示 Windows 服务,并允许您连接到正在运行或已停止的服务、操作它或获取有关它的信息。一个完全未经测试的例子// Check whether the service is started.ServiceController sc  = new ServiceController();sc.ServiceName = "MyAwesomeService";Console.WriteLine("The MyAwesomeService status is currently set to {0}",                    sc.Status.ToString());if (sc.Status == ServiceControllerStatus.Stopped){   // Start the service if the current status is stopped.   Console.WriteLine("Starting MyAwesomeService...");   try    {      // Start the service, and wait until its status is "Running".      sc.Start();      sc.WaitForStatus(ServiceControllerStatus.Running);      // Display the current service status.      Console.WriteLine("The MyAwesomeService is now set to {0}.",                          sc.Status.ToString());   }   catch (InvalidOperationException)   {      Console.WriteLine("Could not start the MyAwesomeService.");   }}更新ServiceController 将使用当前线程的主体来进行注册表和服务控制管理器调用,如果要操作服务,则必须确保将其设置为管理员用户。你可以模拟用户,或者添加更多细粒度的权限来让你的用户启动和停止它,或者强制你的应用程序以管理员权限启动

达令说

可以为应用程序做同样的事情吗?不,没有办法做到这一点。我希望系统在我的应用程序启动时启动某个服务(如果它还没有启动)因此,请延迟服务自动启动/自动启动(取决于您的偏好)。不幸的是,.net 服务存在问题。它们只能通过延迟启动可靠地启动服务自动启动并不意味着该服务将在您的应用程序需要时启动。应用程序可以通过自动启动在服务之前启动。而且,即使服务是从操作系统的角度启动的,也不代表它已经完成了初始化。实现您想要的唯一可靠方法是从应用程序到服务进行通信,例如从服务查询一些数据、获取同步对象等。然后,如果服务可用,则应用程序继续。否则,根据应用程序,它要么等待一段时间并再次尝试通信,要么退出。
随时随地看视频慕课网APP
我要回答