如何从WPF应用程序方法运行Windows服务应用程序

时间:2017-01-19 23:52:43

标签: c# .net wpf service windows-10

我知道从Windows服务应用程序启动进程是不可能的(或者由于在单独的进程中运行Windows服务而非常困难)。但是,是否可以从WPF应用程序内的方法运行Windows服务?如果是这样,我该怎么做C#?

1 个答案:

答案 0 :(得分:3)

首先,一些背景知识:

Windows服务(WS)是一个后台进程,它在没有用户界面的情况下运行(忽略你的顽皮WS与允许服务与桌面交互勾选),并且可以在用户登录之前运行。因此,WS可以在 LOCALSYSTEM 的上下文中运行; NETWORK SERVICE ,甚至是专门用于该服务的明确用户帐户。在启动期间和用户登录之前以Windows启动的服务称为自动启动服务。甚至有一种被称为延迟自动启动的野兽。

  

但是,是否可以从WPF应用程序内的方法运行Windows服务?

如果通过“运行”意味着如何触发先前部署的WS启动,则“是!”。

考虑下面的示例,假设方法SomeMethodInMyWpfApp()存在于WPF应用中的某个位置。然后,通过简单地调用此方法,我们按名称获取对服务控制器的引用,该WS称为“MissPiggyService”。一旦我们有了引用,我们就可以查询服务的状态。它在运行吗?它正在启动的过程中?如果这两个问题的答案都是“否”,那么我们会发出启动服务请求。我们这样做是因为告诉SC启动已经处于启动过程中的服务通常并不好。

void SomeMethodInMyWpfApp()
{

    ServiceController sc = new ServiceController("MissPiggyService");
    if (sc.Status != ServiceControllerStatus.Running && 
        sc.Status != ServiceControllerStatus.StartPending)
    { 
        sc.Start();
    }
}

但是,如果通过“但是,是否可以从WPF应用程序内的方法运行Windows服务?”可以创建;在WPF应用程序中复制并运行外部WS的功能 - 然后没有。

WS不是常规流程。对于一个你不能将一个进程嵌入另一个进程(至少我认为你不能,我们不是在这里谈论AppDomains)但更重要的是,WS需要能够响应Windows服务控制器要求你的WS启动,停止,并可能暂停。常规流程无法实现的东西。