Es gibt ein Problem mit der NamedPipeClientStream
Klasse in .NET, dass Sie nicht eine Instanz dieser Klasse mit PipeDirection.In
erstellen können, und dann erfolgreich die ReadMode
-PipeTransmissionMode.Message
ändern .C# UnauthorizedAccessException beim Aktivieren Message für Nur-Lese-Named Pipe (NamedPipeClientStream Klasse)
Der Versuch, dies zu tun, wird einen UnauthorizedAccessException
auslösen. Obwohl Rohre in der Regel verwendet werden würden, zwischen den Prozessen, dieses einfache Beispiel in einem einzigen Prozess zeigt, das Problem zu kommunizieren:
var pipeOut = new NamedPipeServerStream("SomeNamedPipe",
PipeDirection.Out,
1,
PipeTransmissionMode.Message);
var pipeIn = new NamedPipeClientStream(".",
"SomeNamedPipe",
PipeDirection.In);
pipeIn.Connect();
pipeIn.ReadMode = PipeTransmissionMode.Message;
Dieser Code ein UnauthorizedAccessException
werfen wird, wenn versucht wird, die ReadMode Property zu setzen.
Bei der Suche nach Informationen zu diesem Problem, fand ich Verweise auf sie in anderen Orten, wie zum Beispiel hier:
Named pipes issue: System.UnauthorizedAccessException: Access to the path is denied.
- PipeTransmissionMode.Message: How do .NET named pipes distinguish between messages?
Alle diese Posts erwähnen, dass dies "seltsam", "seltsam" usw. ist, aber nicht erklären, "warum" es nicht funktioniert, und alle geben die gleiche Problemumgehung, die "aus irgendeinem seltsamen Grund" Einstellung Rohrrichtung zu InOut
macht es funktioniert.
Es stimmt zwar, dass es funktioniert, aber es erfordert grundlegende Änderung der Definition der Leitung, an beiden Enden, zu Vollduplex, anstatt in eine einzige Richtung zu gehen, die ich für einen sehr schlechten Ansatz halte, und es sei denn, Sie können sowohl den Client als auch den Server ändern, ist dies möglicherweise nicht möglich.
Meine Frage war, warum ermöglicht Nachrichtenmodus auf eine eingehende Rohr eine Ausnahme verursachen, und gibt es einen besseren Weg, um dieses Problem zu lösen, als das Rohr bidirektionalen Modus zu wechseln?
Es hilft sicherlich nicht, dass die 'PipeDirection'-Enumeration genau rückwärts benannt wird. Sie schreiben an das Eingabeende einer unidirektionalen Pipe, die Daten gehen durch die Pipe zum anderen Prozess und können dann vom Ausgabeende gelesen werden. Aber 'PipeDirection.In' bedeutet lesbar (das Ausgabeende der Pipe). –