我目前正在使用TopShelf和控制台应用程序来创建Windows服务。当我将代码作为控制台应用程序运行时,我使用一些Console.WriteLine()来输出结果。一旦代码执行了应该执行的操作,我就将控制台应用程序安装为Windows服务。
即使Windows服务无法写入控制台,离开Console.WriteLine()代码是否有任何缺点?如果我将Console.WriteLine()留在那里,是否存在代码不稳定的风险?
答案 0 :(得分:35)
The output will simply be discarded
在Windows服务中没有控制台,所以Console.Write *输出是 丢弃。有很多选择:
- System.Diagnostics.Trace类具有类似的接口 控制台类,因此您可以非常轻松地将代码迁移到此。
- 然后可以将其配置为输出到文件。你可以使用 System.Diagnostics.EventLog类,用于写入事件日志,然后可以使用事件查看器进行监视。
- 您可以使用第三方 开源log4net库,非常灵活。
醇>
答案 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