Проблема с классом NamedPipeClientStream
в .NET заключается в том, что вы не можете создать экземпляр этого класса с помощью PipeDirection.In
, а затем успешно изменить ReadMode
на PipeTransmissionMode.Message
.
Попытка сделать это повысит значение UnauthorizedAccessException
. Хотя трубы обычно используются для связи между процессами, этот простой пример в рамках одного процесса показывает проблему:
var pipeOut = new NamedPipeServerStream("SomeNamedPipe",
PipeDirection.Out,
1,
PipeTransmissionMode.Message);
var pipeIn = new NamedPipeClientStream(".",
"SomeNamedPipe",
PipeDirection.In);
pipeIn.Connect();
pipeIn.ReadMode = PipeTransmissionMode.Message;
Этот код генерирует UnauthorizedAccessException
при попытке установить свойство ReadMode.
В поисках информации по этой проблеме я нашел ссылки на нее в других местах, например здесь:
-
Проблема с именами: System.UnauthorizedAccessException: доступ к пути запрещен.
-
WPF - обмен сообщениями с использованием протокола Windows Pipes
- PipeTransmissionMode.Message: Как .NET-именованные каналы различают сообщения?
Все эти сообщения упоминают, что это "странно", "странно" и т.д., но не объясняют "почему" это не работает, и все они дают одинаковое обходное решение, что "по какой-то странной причине" направление трубы на InOut
заставляет его работать.
Это правда, что это заставляет его работать, но для этого требуется принципиально изменить определение трубы на обоих концах на полный дуплекс, а не идти в одном направлении, что я считаю очень слабым, и если вы можете изменить как клиент, так и сервер, это может быть даже невозможно.
Вопрос в том, почему включение режима сообщений во входящем потоке вызывает исключение, и есть ли лучший способ решить эту проблему, чем изменить канал на двунаправленный режим?