为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
吃鸡游戏 2021-06-02 16:31:32
Windows 服务可以指定它依赖于另一个第二服务。当系统尝试启动(第一个)服务时,它会看到它依赖于第二个服务并首先启动它(第二个)。可以为应用程序做同样的事情吗?我希望系统在我的应用程序启动时启动某个服务(如果它还没有启动)。我不能只是从我的应用程序中调用它,因为我的应用程序在没有管理员权限的情况下运行,而服务作为本地系统运行。该服务已安装在计算机上。(我知道我可以让系统自动启动服务。不幸的是, .net Services存在问题。它们只能通过延迟启动可靠地启动,并且我的应用程序需要立即可用。)
查看完整描述

2 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

当您的应用程序启动时,只需检查服务是否已启动

服务控制器类

表示 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 将使用当前线程的主体来进行注册表和服务控制管理器调用,如果要操作服务,则必须确保将其设置为管理员用户。


你可以模拟用户,或者添加更多细粒度的权限来让你的用户启动和停止它,或者强制你的应用程序以管理员权限启动


查看完整回答
反对 回复 2021-06-05
?
达令说

TA贡献1821条经验 获得超6个赞

可以为应用程序做同样的事情吗?

不,没有办法做到这一点。

我希望系统在我的应用程序启动时启动某个服务(如果它还没有启动)

因此,请延迟服务自动启动/自动启动(取决于您的偏好)。

不幸的是,.net 服务存在问题。它们只能通过延迟启动可靠地启动

服务自动启动并不意味着该服务将在您的应用程序需要时启动。应用程序可以通过自动启动在服务之前启动。

而且,即使服务是从操作系统的角度启动的,也不代表它已经完成了初始化。

实现您想要的唯一可靠方法是从应用程序到服务进行通信,例如从服务查询一些数据、获取同步对象等。然后,如果服务可用,则应用程序继续。否则,根据应用程序,它要么等待一段时间并再次尝试通信,要么退出。


查看完整回答
反对 回复 2021-06-05
  • 2 回答
  • 0 关注
  • 210 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信