首页 > 解决方案 > 手动打开控制台的 Windows 服务

问题描述

要在 Visual Studio 中调试 Windows 服务,我通过调用 console.ReadKey(true) 而不是使用 while(true) 手动打开控制台窗口以保持服务运行...

这已经工作了多年,但最近我遇到了一个例外:
“当任一应用程序没有控制台或控制台输入已从文件重定向时,无法读取密钥”

项目输出类型是“Windows 应用程序”,这是 Windows 服务的默认值。根据在控制台模式下运行 Windows 服务中接受的答案?我试图将其设置为“Concole Application”。显示了控制台(没有我的 ShowConsoleWindow 调用),但我不知道如果真正的 Windows 服务突然在 RELEASE 中有一个控制台,可能会出现哪些副作用,所以我更愿意将其保留为“Windows 应用程序”。

这是启动例程

static void Main(string[] args)
{
    #if (!DEBUG)
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new HostService(args) };
        ServiceBase.Run(ServicesToRun);
    #else
        InteropWindows.ShowConsoleWindow();

        using (HostService srv = new HostService(args))
        {
            srv.MyRun(args);

            Console.WriteLine("Host Service is running. Press any key to stop...");
            Console.ReadKey(true);
            Console.WriteLine("Stopping service...");

            srv.MyStop();
        }
    #endif 
}

InteropWindows.ShowConsoleWindow():

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

    if (handle == IntPtr.Zero)
    {
        bool succcess = NativeMethods.AllocConsole();
        uint lastErr = NativeMethods.GetLastError();
    }
    else
        ShowWindow(handle, ShowWindowCommand.Show);
}

NativeMethods.AllocConsole() 返回 true,NativeMethods.GetLastError() 为 0,但新的控制台窗口不再打开(正如我所说的它曾经工作多年)。
Console.WriteLine() 不打印任何内容,但也不抛出任何内容。
Console.ReadKey(true); 然后在主程序中抛出上面显示的异常。

按照异常的建议改用 Console.Read() ,只是无限地阻止应用程序,这样我就可以使用 while(true);

有任何想法吗?

标签: c#consolewindows-services

解决方案


推荐阅读