c# - 手动打开控制台的 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);
有任何想法吗?
解决方案
推荐阅读
- javascript - 希望构建一个正则表达式,以按顺序查找由不同特定长度的空格分隔的 3 个单词
- ocr - 如何在不使用可执行文件的情况下在 Windows 上使用 tesseract?
- sql - Oracle:棘手的更新和插入内部循环
- javascript - 尝试创建一个单独的文件,我可以在涉及“新”的 JavaScript 中导入
- python - 如何通过python中的给定字符串生成随机数?
- google-api - 范围 https://www.googleapis.com/auth/calendar.app.created 的 Google 日历 API 请求被拒绝
- jenkins - 如何获取作业源代码管理列表并为所有作业构建
- mysql - SQL中如何对一张表的一行使用多张表
- python - 在 Keras 嵌入层中获取一个热向量
- autodesk-forge - 使用 Autodesk Forge 查看器时,是否可以按需加载模型的不同部分(不是所有部分)