У меня есть библиотека программного обеспечения, предназначенная для консольных приложений.Я хотел бы запустить небольшой набор интеграционных тестов, использующих консоль Windows, в безголовом средстве запуска, которое в идеале должно запускаться на нашем сервере сборки и в модуле тестирования нового образца.
Чтобы это работало, мне нужно, чтобы в тесте выполнялись реальные вызовы 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());
}