Кажется, что NamedPipeServerStream
это не , работающий в Windows 10.
Я использую следующий код для создания именованного канала из моего приложения на C #. Этот код был скопирован непосредственно из примера MSDN, поэтому должен быть правильным, я полагаю:
class Program
{
static void Main(string[] args)
{
using (NamedPipeServerStream pipeServer =
new NamedPipeServerStream("testpipe", PipeDirection.Out))
{
Console.WriteLine("NamedPipeServerStream object created.");
Console.Write("Waiting for client connection... ");
pipeServer.WaitForConnection();
Console.WriteLine("Client connected.");
try
{
using (StreamWriter sw = new StreamWriter(pipeServer))
{
sw.AutoFlush = true;
sw.WriteLine("Hallo world!");
Console.WriteLine("Data was written.");
}
}
catch (IOException e)
{
Console.WriteLine("{0}: {1}", e.GetType().Name, e.Message);
}
Console.WriteLine("Pipe closed.");
}
}
}
Теперь, если я запустите эту программу, канал будет создан успешно. Но в Windows 10 каждая попытка чтения из канала в терминале завершается неудачей немедленно с ошибкой "Все экземпляры канала заняты" :
Microsoft Windows [Version 10.0.17134.228]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Users\MuldeR>type \\.\pipe\testpipe
All pipe instances are busy.
Сразу после этого "главная" программа сообщает, что канал сломан.
Запутанно, точно такая же программа корректно работает на Windows 7 : текст "Привет, мир!" можно прочитать из канала в терминале (с помощью точно такой же команды, как указано выше), просто отлично:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.
C:\Users\testuser>type \\.\pipe\testpipe
Hallo!
Что мне не хватает ???
Спасибо!
Справочная информация:
Моя цель - передать строку (пароль) в приложение командной строки, которое не способно получить строку непосредственно из командной строки. Вместо этого программа командной строки может принимать только имя файла и будет читать строку из указанного файла. Но я не хочу создавать (временный) «физический» файл, а хочу передать строку через именованный канал - аналогичным образом я бы сделал это с mkfifo в Unix.
(я могу не изменить программу командной строки)