如何在Windows服务中启动控制台屏幕

时间:2013-02-04 10:55:58

标签: c# logging windows-services

我使用Tow方法将我的应用程序(Windows应用程序)记录到文件和控制台屏幕

public static void InitLogFile(string filename)
{

    FileStream fs = new FileStream(filename, FileMode.Create);
    Trace.Listeners.Add(new TextWriterTraceListener(fs));
    Trace.AutoFlush = true;

}
public static void InitConsole()
{
    Trace.Listeners.Add(new ConsoleTraceListener());
    Trace.AutoFlush = true;
}

我在启动Windows应用程序时使用此代码启动控制台屏幕

  [DllImport("kernel32.dll",EntryPoint = "GetStdHandle",SetLastError = true,CharSet = CharSet.Auto,
        CallingConvention = CallingConvention.StdCall)]
        private static extern IntPtr GetStdHandle(int nStdHandle);

        [DllImport("kernel32.dll",EntryPoint = "AllocConsole",SetLastError = true,CharSet = CharSet.Auto,
        CallingConvention = CallingConvention.StdCall)]
        private static extern int AllocConsole();


        private const int STD_OUTPUT_HANDLE = -11;
        private const int MY_CODE_PAGE = 437;

        void StartConsole()
        {
            AllocConsole();
            IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
            var safeFileHandle = new SafeFileHandle(stdHandle, true);
            var fileStream = new FileStream(safeFileHandle, FileAccess.Write);
            var encoding = Encoding.GetEncoding(MY_CODE_PAGE);
            var standardOutput = new StreamWriter(fileStream, encoding) {AutoFlush = true};
            Console.SetOut(standardOutput);
        }

我的问题是:

我将我的Windows应用程序转换为windows service控制台日志屏幕现在无法正常显示如何使其运行?

2 个答案:

答案 0 :(得分:2)

Windows服务不像标准Windows应用程序那样运行。它可能在没有用户登录到计算机时运行,那么控制台屏幕怎么会出现?

作为服务运行时,您应该考虑写入Windows事件日志或其他一些日志记录机制。

答案 1 :(得分:1)

您没有看到任何内容的原因是Session 0 Isolation

但是,有一个很好的代码项目article,它将在用户会话中从服务运行应用程序。

只需将代码放入exe文件中,然后使用链接中的项目启动exe文件。