【问题标题】:Running a Windows Forms app. from a service运行 Windows 窗体应用程序。从服务
【发布时间】:2010-04-08 08:12:39
【问题描述】:

我有一个奇怪的应用程序,用于开发和测试我需要一个 Windows 窗体应用程序,以便我可以监控它在做什么。对于生产,应用程序将从服务启动,不需要可见的 UI。我真的不想重新编写应用程序。一旦它完成到控制台应用程序中,所以我想保留它但从服务启动它。

我的问题是这个应用程序可以通过服务正常工作吗?目前它有 UI 元素,我已经能够使用 Process 类 (System.Diagnostics) 从服务成功启动应用程序。

这种方法有什么问题吗?

【问题讨论】:

    标签: c# windows-services winforms


    【解决方案1】:

    使用配置管理器为您的应用程序创建一个 gui 构建和一个服务构建,然后使用以下结构来控制您的应用程序的启动方式:

    #ifdef GUI
      // load gui
    #else
      // run as service
    #endif
    

    【讨论】:

    • 在这种情况下我通常也会这样做。请注意,这并不重要:除非您开始在服务中弹出模式对话框(在这种情况下,用户可能会在 R2/7 下收到通知),否则您可以愉快地在服务上下文中创建和运行 Windows 窗体。如果在服务上下文中运行,则不创建表单只是一个节省资源的小步骤。
    【解决方案2】:

    我认为没有问题。

    如果应用程序是控制台应用程序,您可以仅使用配置来控制可见性。现在,您需要另一个应用程序 (Winform) 来执行相同的操作。

    【讨论】:

      【解决方案3】:

      我认为通常这样做的方式是拥有一个单独的 GUI 应用程序,以某种方式与服务通信。

      【讨论】:

      • 嗨,克里斯,是的,我同意,但是在这种情况下,您可以将应用程序想象成文件副本之类的东西。一旦投入生产,它就不需要任何监控——只需开火就可以了。但在开发中。例如,我想查看哪些文件在 UI 中获取副本(这只是一个示例)。
      【解决方案4】:

      如果您的逻辑在一个单独的库中,而您的 GUI 应用程序只是调用它,那么让控制台应用程序也做同样的事情应该是微不足道的。您只需在一处更改逻辑,并有两个前端...

      【讨论】:

        【解决方案5】:

        您需要调整注册表SYSTEM\CurrentControlSet\Services\YourServiceName 注册表位置中Type 字段的值。见this article

        作为旁注;服务不应该那样工作 - 它们应该完全在后台。

        最好公开某种外部控制 API,例如可能通过网络套接字。然后,您可以在系统托盘或Hide 模式下运行一个单独的 Windows 窗体应用程序,并在每次从服务接收到内容时弹出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多