【问题标题】:Run a WPF Application as a Windows Service将 WPF 应用程序作为 Windows 服务运行
【发布时间】:2018-11-21 04:41:26
【问题描述】:

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

有人做过类似的事情吗?
有可能吗?

我们不需要与桌面或任何 GUI 交互,如果有一个应用程序可以通过 GUI 运行,从命令行(有效)或作为服务运行,那就太好了。

期待有趣的输入:-)

【问题讨论】:

    标签: c# wpf windows service


    【解决方案1】:

    根据经验,服务不应该有任何类型的 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,程序会启动并等待让你按回车键关闭。

    【讨论】:

    • 这对于 CLI 和服务来说很好。
    • 感谢您的代码。必须深入挖掘 Services Stuff 才能了解 OnStop 部分。
    【解决方案2】:

    我们确实解决了这个问题并写了一篇关于它的小帖子:
    http://remy.supertext.ch/2011/11/a-wpf-project-running-from-the-cmd-prompt-or-as-a-service-and-has-a-gui/

    也许它对某人有帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我也在考虑这个问题。听起来像是一个合理的解决方案。但是为什么对 WPF 或 WinForms 的引用不好呢?只要它只是一个参考?
      • @Remy:静态引用在开始时加载程序集。
      【解决方案4】:

      如果您已经在命令行中运行它,那么您已经成功了一半。当您想将应用程序作为服务运行时,一些应用程序只有简单的标志指定,检查这些标志并相应地让您的逻辑流程。比如:

      myapp.exe --runservice
      

      【讨论】:

      • 不错的建议,但我发现默认情况下让 CLI 作为服务运行通常会更好。它简化了设置。
      【解决方案5】:

      看看这个。这使得任何可执行文件都作为服务运行。

      英语:http://support.microsoft.com/?scid=kb;en-us;137890&x=7&y=13

      法语:http://support.microsoft.com/kb/137890

      【讨论】:

        【解决方案6】:

        我的解决方法是添加一个Main入口函数,比如:

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

        现在我们有两个应用程序启动条目 - 一个用于 WPF,一个用于 Windows 服务。

        我们可以通过右键单击您的项目并选择Properties -> Application -> Startup object,在 Visual Studio 中配置启动对象。

        设置入口并重建会得到你想要的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-08
          • 2014-06-21
          • 1970-01-01
          相关资源
          最近更新 更多