NamedPipeServerStream не работает в Windows 10 (работает в Windows 7) - PullRequest
0 голосов
/ 04 сентября 2018

Кажется, что 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.

(я могу не изменить программу командной строки)

1 Ответ

0 голосов
/ 13 сентября 2018

У нас аналогичные проблемы с нашим программным обеспечением со многими клиентами, кажется, что какая-то версия Windows 10 ломает именованные каналы, очень расстраивает.

В документах MSDN теперь указано следующее:

Windows 10, версия 1709: каналы поддерживаются только в контейнере приложения; то есть от одного процесса UWP к другому процессу UWP, который является частью того же приложения. Кроме того, именованные каналы должны использовать синтаксис "\. \ Pipe \ LOCAL \" для имени канала.

Очень непонятно, что это значит ...

...