【发布时间】:2018-11-21 04:41:26
【问题描述】:
我们正在开发一个我们希望能够作为 Windows 服务运行的 Windows Presentation Foundation 应用程序。
有人做过类似的事情吗?
有可能吗?
我们不需要与桌面或任何 GUI 交互,如果有一个应用程序可以通过 GUI 运行,从命令行(有效)或作为服务运行,那就太好了。
期待有趣的输入:-)
【问题讨论】:
我们正在开发一个我们希望能够作为 Windows 服务运行的 Windows Presentation Foundation 应用程序。
有人做过类似的事情吗?
有可能吗?
我们不需要与桌面或任何 GUI 交互,如果有一个应用程序可以通过 GUI 运行,从命令行(有效)或作为服务运行,那就太好了。
期待有趣的输入:-)
【问题讨论】:
根据经验,服务不应该有任何类型的 UI。这是因为服务通常以非常高的权限运行,如果您对输入不十分小心,可能会发生坏事。 (我认为最新版本的 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,程序会启动并等待让你按回车键关闭。
【讨论】:
我们确实解决了这个问题并写了一篇关于它的小帖子:
http://remy.supertext.ch/2011/11/a-wpf-project-running-from-the-cmd-prompt-or-as-a-service-and-has-a-gui/
也许它对某人有帮助。
【讨论】:
不要这样做。将所有内容写入引擎程序集,然后从 GUI 和服务中引用它。 CLI 可以是第三个可执行文件,也可以是服务可执行文件的重用。关键是允许服务在不引用 WPF 或 WinForms 或您使用的任何 GUI 框架的情况下运行。
【讨论】:
如果您已经在命令行中运行它,那么您已经成功了一半。当您想将应用程序作为服务运行时,一些应用程序只有简单的标志指定,检查这些标志并相应地让您的逻辑流程。比如:
myapp.exe --runservice
【讨论】:
看看这个。这使得任何可执行文件都作为服务运行。
英语:http://support.microsoft.com/?scid=kb;en-us;137890&x=7&y=13
【讨论】:
我的解决方法是添加一个Main入口函数,比如:
public static void Main()
{
ServiceBase.Run(new MyService());
}
现在我们有两个应用程序启动条目 - 一个用于 WPF,一个用于 Windows 服务。
我们可以通过右键单击您的项目并选择Properties -> Application -> Startup object,在 Visual Studio 中配置启动对象。
设置入口并重建会得到你想要的。
【讨论】: