我们正在开发一个Windows Presentation Foundation应用程序,我们希望它能够作为Windows服务运行。
有人做过类似的事情吗? 有可能吗?
我们不需要与桌面或任何GUI进行交互,只需要一个可以通过GUI,命令行(可以正常工作)或作为服务运行的应用程序就可以了。
期待有趣的输入: - )
答案 0 :(得分:14)
作为经验法则,服务永远不应该有任何类型的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
,程序将启动并等待你按Enter键关闭。
答案 1 :(得分:4)
我们实际上已经解决了,并写了一篇关于它的帖子:
http://remy.supertext.ch/2011/11/a-wpf-project-running-from-the-cmd-prompt-or-as-a-service-and-has-a-gui/
也许对某人有所帮助。
答案 2 :(得分:3)
不要这样做。将所有内容写入引擎程序集,然后从GUI和服务引用它。 CLI可以是第三个可执行文件,也可以是服务可执行文件的重用。关键是允许服务运行而不引用任何WPF或WinForms或您使用的任何GUI框架。
答案 3 :(得分:0)
如果您已经从命令行使用它,那么就在那里。有些应用程序只是在您希望将应用程序作为服务运行时使用简单的标志名称,请检查这些标志并相应地使用逻辑流程。类似的东西:
myapp.exe --runservice
答案 4 :(得分:0)
检查一下。这使得任何可执行文件都作为服务运行。
英语:http://support.microsoft.com/?scid=kb;en-us;137890&x=7&y=13
答案 5 :(得分:0)
我的解决方案是添加Main
条目函数,例如:
public static void Main()
{
ServiceBase.Run(new MyService());
}
现在我们有两个应用启动条目 - 一个用于WPF,另一个用于Windows服务。
我们可以通过右键单击您的项目并选择Properties
- >来在Visual Studio中配置启动对象。 Application
- > Startup object
。
设置条目和重建将为您提供所需的信息。