2010-09-17 120 views
9

我们正在开发,我们希望能够运行为Windows服务的Windows Presentation Foundation的应用。运行WPF应用程序作为Windows服务

没有人做这样的事情?
可能吗?

我们不需要与桌面或任何GUI交互,这纯粹是不错的一个应用,我们可以使用GUI运行,从命令行(的作品),或者作为一个服务。

期待有趣输入:-)

回答

12

由于拇指服务规则不应该有什么样的用户界面。这是因为服务通常以非常高的权限运行,如果您不太注意输入,就会发生不好的事情。 (我认为最新版本的Windows不会让你从服务中创建UI,但我不是100%确定的。)

如果您需要与服务进行通信,则应该使用某种形式的IPC( WCF,管道,插座,  ...)。如果你想要一个简单的控制台程序,也可以是服务,我知道一个把戏设置了:

class MyExampleApp : ServiceBase 
{ 
    public static void Main(string[] args) 
    { 
     if (args.Length == 1 && args[0].Equals("--console")) 
     { 
      new MyExampleApp().ConsoleRun(); 
     } 
     else 
     { 
      ServiceBase.Run(new MyExampleApp()); 
     } 
    } 
    private void ConsoleRun() 
    { 
     Console.WriteLine(string.Format("{0}::starting...", GetType().FullName)); 

     OnStart(null); 

     Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName)); 
     Console.ReadLine(); 

     OnStop(); 

     Console.WriteLine(string.Format("{0}::stopped", GetType().FullName)); 
    } 
    //snip 
} 

如果只是启动该程序,它将启动服务(如果骂你你可以从控制台运行它),但是如果在启动时添加参数--console,程序将启动并等待您输入以关闭。

+0

这适用于CLI和服务。 – 2010-09-17 15:33:23

+0

感谢您的代码。必须深入了解服务内容以了解OnStop部分。 – Remy 2010-09-18 18:36:14

0

如果你已经拥有它的命令行工作的你走了一半。有些应用程序只有当您想要将应用程序作为服务运行时使用的简单标志名称,请检查这些标志并相应地让您的逻辑流动。例如:

myapp.exe --runservice 
+0

不错的建议,但是我发现通常CLI作为默认服务运行会更好。它简化了设置。 – 2010-09-20 01:42:39

3

不要这样做。将所有内容写入引擎程序集,然后从GUI和服务中引用它。 CLI可以是第三个可执行文件,也可以是服务可执行文件的重用。关键是允许服务在没有任何引用WPF或WinForms或任何GUI框架的情况下运行。

+0

我也在想这个。听起来像是一个合理的解决方案。但是为什么对WPF或WinForms的引用不好?只要它只是一个参考? – Remy 2010-09-18 18:23:28

+0

@Remy:静态引用在开始时加载程序集。 – 2010-09-20 01:42:09

0

我的解决办法是增加一个主入口的功能,如:

public static void Main() 
{ 
    ServiceBase.Run(new MyService()); 
} 

现在我们有两个应用程序启动项,一为WPF,一个用于Windows的服务;

我们可以在Visual Studio中配置启动对象 - >项目属性 - >应用程序 - >启动对象。

所以设置进入和重建,U将得到ü想要的东西。

相关问题