代码之家  ›  专栏  ›  技术社区  ›  Jack Ryan

可以作为服务或控制台应用程序运行的应用程序的可接受模式是什么

  •  4
  • Jack Ryan  · 技术社区  · 17 年前

    我有一个项目作为windows服务部署到生产环境中。但是,出于本地开发目的,将其作为控制台应用程序运行会很有用。现在我有一门课叫 ReportingHost 它提供了我的核心功能,以及一个名为ReportingServiceHost的类,该类继承自 ServiceBase 并允许我将应用程序作为服务运行。还有一个程序类,它有一个调用 ServiceBase.Run 在我的ReportingServiceHost上。

    我想我需要写一封信 ReportingConsoleHost 类,该类允许我在控制台中运行该功能。然后我需要修改我的 Main 对命令行开关作出反应并选择其中一个。这是我遇到的两个问题。

    this 并试图使用该代码,但我的应用程序立即退出,它不会显示控制台窗口,也不会在关闭前等待Enter。

    4 回复  |  直到 17 年前
        1
  •  9
  •   Marc Gravell    17 年前

    我怀疑您的测试项目配置为windows exe,而不是控制台exe。使用windows exe Console.ReadLine 我马上回来。

    Environment.UserInteractive -即。

    static void Main() {
        if(Environment.UserInteractive) {
            // code that starts the listener and waits on ReadLine
        } else {
            // run the service code that the VS template injected
        }
    }
    

    当然,您也可以使用命令行开关。我举了一个例子 microsoft.public.dotnet.languages.csharp

    • 安装程序/卸载程序
    • 服务
    • 控制台模式应用程序

    取决于开关

        2
  •  2
  •   adrianbanks    17 年前

    我以前通过实现一个普通的Windows服务(通过从ServiceBase派生)实现了这一点,但是在main方法中加入了一个检查来检查命令行参数。

    如果参数包含 /console ,启动控制台版本,否则启动服务。

    internal class MyService : ServiceBase
    {
        internal static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                // run as a service....
                ServiceBase[] servicesToRun = new ServiceBase[] {new MyService()};
                Run(servicesToRun);
            }
            else
            {
                // run as a console application....
            }
        }
    }
    

        3
  •  2
  •   Wim ten Brink    17 年前

    我的建议?将服务的所有逻辑放在单独的程序集中。(一个类库或DLL。)然后创建一个项目作为服务,它引用您的类库并将代码作为服务使用。创建第二个控制台项目,该项目也引用您的类库,但将使其作为控制台应用程序可用。 在您的解决方案中,最终会有三个不同的项目,但它确实允许您将事情分开。事实上,这也可以将您的服务扩展到其他几种形式。例如,您可以创建第四个项目作为web服务,从而从客户端系统上的web浏览器调用您的服务。因为软件逻辑与使用逻辑是分离的,所以您可以对其进行大量控制。

    请注意,服务的运行可能比控制台应用程序有更多的限制。通常,服务在默认情况下不具有网络访问权限,也没有为其分配用于显示错误消息的监视器,并且通常使用有限的用户帐户或系统帐户运行。您的服务可能作为一个控制台工作,但作为一个服务失败,因为这一点。

        4
  •  1
  •   Conceptdev    17 年前

    Brian Noyes' Debuggable Self-Host Windows Service Project 博客文章-它谈论WCF,但应该适用于任何“Windows服务”。

    最好的东西是示例代码——如果您不能找出上面的示例“适合”的地方,请抓取完整的项目,看看它是如何工作的。谢谢 Brian