Windows服务中的Console.WriteLine()?

时间:2012-01-09 18:01:08

标签: c# windows-services topshelf

我目前正在使用TopShelf和控制台应用程序来创建Windows服务。当我将代码作为控制台应用程序运行时,我使用一些Console.WriteLine()来输出结果。一旦代码执行了应该执行的操作,我就将控制台应用程序安装为Windows服务。

即使Windows服务无法写入控制台,离开Console.WriteLine()代码是否有任何缺点?如果我将Console.WriteLine()留在那里,是否存在代码不稳定的风险?

5 个答案:

答案 0 :(得分:35)

The output will simply be discarded

  

在Windows服务中没有控制台,所以Console.Write *输出是   丢弃。有很多选择:

     
      
  1. System.Diagnostics.Trace类具有类似的接口   控制台类,因此您可以非常轻松地将代码迁移到此。
  2.   
  3. 然后可以将其配置为输出到文件。你可以使用   System.Diagnostics.EventLog类,用于写入事件日志,然后可以使用事件查看器进行监视。
  4.   
  5. 您可以使用第三方   开源log4net库,非常灵活。
  6.   

答案 1 :(得分:8)

不,控制台类会安全地写入STDOUT,但你不会看到输出。

答案 2 :(得分:2)

如果使用System.Diagnostics.Trace功能,则可以使用侦听器和开关重定向输出。如果使用TRACE符号进行编译,则将包含代码。如果不添加TRACE,则不会将其编译到项目中。

如果您将服务作为控制台运行以进行调试,则默认情况下Trace将输出到控制台。我已经开始使用Trace而不是Debug或Console写入,因为我可以从配置文件中将跟踪信息输出到文件,屏幕,数据库等的任意组合。

答案 3 :(得分:2)

在Windows Server 2008R2之前,输出始终被丢弃。在该操作系统上安装的服务中保留console.writeline(),启动/运行服务时会出现错误1067,具体取决于writeline()的位置。

答案 4 :(得分:0)

还希望根据命令行显示帮助。
我的解决方案是打开一个新控制台。

internal static class NativeMethods
{
    [DllImport("user32.dll")]
    internal static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    internal static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

    [DllImport("kernel32.dll")]
    internal static extern bool AllocConsole();

    [DllImport("kernel32.dll")]
    internal static extern IntPtr GetConsoleWindow();
}

public static void ShowWindow(IntPtr hWnd, ShowWindowCommand cmd = ShowWindowCommand.Restore)
{
    NativeMethods.SetForegroundWindow(hWnd);
    NativeMethods.ShowWindowAsync(hWnd, (int)cmd);
}

public static void ShowConsoleWindow()
{
    var handle = NativeMethods.GetConsoleWindow();

    if (handle == IntPtr.Zero)
        NativeMethods.AllocConsole();
    else
        ShowWindow(handle, ShowWindowCommand.Show);
}

ShowWindowCommand只是从此处构建的一个枚举
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow