C# 编译输出类型为Exe的windows服务

C# 编译输出类型为Exe的windows服务,c#,windows-services,C#,Windows Services,目前,在开发windows服务时,我修改了csproj,将OutputType设置为调试模式下的Exe,以便获得一个控制台窗口,并且可以轻松调试服务 我想知道的是,在发布模式下这样投入生产有什么问题吗?我没有看到控制台窗口,当通过InstallUtil安装服务并启动时,它似乎没有显示、隐藏或创建 有什么想法吗?大多数服务通常是exe输出类型。是的,当它作为服务运行时,将不会有控制台,但只要您不从控制台读取任何内容,就不会有问题。您可以将写操作作为服务写入控制台,系统只会忽略文本 通常我要做的是让

目前,在开发windows服务时,我修改了csproj,将OutputType设置为调试模式下的Exe,以便获得一个控制台窗口,并且可以轻松调试服务

我想知道的是,在发布模式下这样投入生产有什么问题吗?我没有看到控制台窗口,当通过InstallUtil安装服务并启动时,它似乎没有显示、隐藏或创建


有什么想法吗?

大多数服务通常是exe输出类型。是的,当它作为服务运行时,将不会有控制台,但只要您不从控制台读取任何内容,就不会有问题。您可以将写操作作为服务写入控制台,系统只会忽略文本

通常我要做的是让程序监视字符串
--debug
作为命令行参数传入,如果是,它将作为控制台应用程序启动服务,如果不是,它将作为服务启动。下面是一个如何执行此操作的示例:

static void Main(string[] args)
{
        var debugMode = args.Contains("--debug", StringComparer.InvariantCultureIgnoreCase);

        if (!debugMode)
        {
            ServiceBase[] servicesToRun =
            {
                new MyService();
            };
            ServiceBase.Run(servicesToRun);
        }
        else
        {
            var service = new MyService();
            service.StartService(args);
            Console.WriteLine("Service is now running, press enter to stop...");
            Console.ReadLine();
            service.StopService();
        }
    }
}
然后在服务代码中我会这样做

public partial class MyService : ServiceBase
{
    internal void StartService(string[] args)
    {
        OnStart(args);
    }

    internal void StopService()
    {
        OnStop();
    }

    //... The rest of the code here
}

跟踪输出对于调试来说同样容易,并且不需要服务来创建控制台窗口。您甚至可以将其保留在发布版本中。我确实使用跟踪输出,以及许多其他可配置的日志选项。问题很简单,如果在生产环境中部署时将其构建为一个控制台应用程序,会不会产生负面影响。谢谢您的回答。你把它钉在了上半部分,我认为下半部分会帮助其他开发者。我做了类似的事情,但我们不使用命令行参数。这里有一个要点,展示了我们如何使用依赖注入和条件属性开始我们的工作。