【问题标题】:One executable that starts as console or win32 service based on command line parameter in .NET?一个基于 .NET 中的命令行参数作为控制台或 win32 服务启动的可执行文件?
【发布时间】:2010-10-27 13:11:01
【问题描述】:

是否可以在 .net 中编写可以注册为 Win32 服务并作为服务运行但出于调试目的可以作为具有控制台输出的控制台应用程序启动的可执行应用程序(作为性能计数器,文本日志文件对于监控)

或者我应该将应用程序逻辑(应用程序类)放在一个单独的程序集中,并编写两个完全不同的可执行包装器(win32 服务和控制台),用Application 类引用这个库?

控制台

main()
{
  Application.Start();
  Console.Readkey();
  Application.Stop(); 
}

Win32 服务

OnStart()
{
  Application.Start();
}

OnStop()
{
  Application.Stop();
}

【问题讨论】:

    标签: .net executable


    【解决方案1】:

    是的,我以前做过。我创建了一个windoes服务项目,在项目属性(来自windows应用程序)上将类型更改为控制台应用程序,并根据命令行参数添加了一个条件:

    /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
    
            // setup DI 
            BootStrapper.Setup();
    
            if (!Environment.UserInteractive)
            {
                ServiceManager serviceManager = new ServiceManager();
                serviceManager.Start();
            }
            else if(args.Length==1 && args[0]==HarnessGuid)
            {
                RunInHarnessMode();
            }
            else
            {
                ServiceBase[] servicesToRun = new ServiceBase[] { new ServiceManager() };
                ServiceBase.Run(servicesToRun);
            }       
        }
    

    UserInteractive 也可以做到这一点。

    【讨论】:

      【解决方案2】:

      在您的Main() 方法中检测您是否要作为控制台或服务运行。如果作为控制台运行,只需直接调用OnStart()。如果将 a 作为服务运行,请致电 Run()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 2016-11-02
        • 2013-02-23
        • 1970-01-01
        • 2016-06-10
        • 2021-03-26
        相关资源
        最近更新 更多