我有一个针对控制台应用程序的软件库。我想运行一套瘦身的集成测试,这些测试在无头赛跑者中使用Windows控制台,理想情况下,它们应在构建服务器和Resharper测试赛跑者中运行。
为了完成这项工作,我需要在测试中执行实际的System.Console
调用(因此不能有条件地将其注释掉。)
[当测试调用需要stdout句柄的内容时,例如Console.SetCursorPosition
,生成异常:System.IO.IOException: 'The handle is invalid'
我以为我可以打个电话然后调用FreeConsole
和AllocConsole
,这将允许我调用相关方法。不幸的是,事实并非如此。
目前,我可以成功释放,分配和将控制台输出重定向回STDOUT,但这不会更改异常行为。有什么想法吗?
我使用以下命令将STDOUT重定向回CONOUT:-
var stdoutFile = ExternalMethods.CreateFile("CONOUT$", FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
var handle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdoutFile, true);
if (handle.IsInvalid)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
if (!ExternalMethods.SetStdHandle(-11, handle))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
我最终完成了这项工作。必须使用CREATE_NO_WINDOW标志创建一个子流程,等到该流程开始新的控制台会话后再附加到该子流程。