在 Windows XP 和 .Net 3.5 上使用 NamedPipes 时的 InvalidOperationEx
本文关键字:NamedPipes 时的 InvalidOperationEx XP Windows Net | 更新日期: 2023-09-27 17:57:17
我正在使用命名管道在.Net 3.5的两个进程之间进行通信。这在Windows 7上工作正常,但不知何故在Windows XP下不行。
我在那里收到一个无效操作异常。这是我尝试翻译德语消息:"尚未设置管道手柄。你的 PipeStream 实现是否调用了 InitializeHandle?"
我为此创建了一个测试项目:http://www.chinery.de/dateien/NamedPipeTest.zip
在应用程序中,您可以点击"连接",然后会看到管道的名称。在右侧,您可以输入一条消息,如果一切顺利,该消息将通过管道发送。
正如我所说,这个问题只出现在Windows XP上。
有人对此有线索吗?
我最近自己遇到了这个问题。我的解决方案是在调用NamedPipeClientStream.Connect()
后设置NamedPipeClientStream.ReadMode
。否则我会得到上面提到的Pipe handle has not been set. Did your PipeStream implementation call InitializeHandle?
例外。
我终于自己找到了解决方案。这是管道客户端的创建:
NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost", PipeName, PipeDirection.InOut)
我不得不将其更改为: NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", PipeName, PipeDirection.InOut)
(将服务器名称从"本地主机"更改为".")
这在某种程度上适用于Windows 7,但不适用于XP。现在它终于在两个系统上工作了。
它可能有权限问题: 因此,需要提供所需的访问权限。
PipeSecurity _pipeSecurity = new PipeSecurity();
PipeAccessRule psEveryone = new PipeAccessRule("Everyone", PipeAccessRights.FullControl,
System.Security.AccessControl.AccessControlType.Allow);
_pipeSecurity.AddAccessRule(psEveryone);
NamedPipeServerStream pipeServer = new NamedPipeServerStream(PipeName, PipeDirection.In,
1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 4, 4, _pipeSecurity);
要克服仅听一次的问题,请按照以下步骤操作:右键单击相应的服务>属性>登录>登录身份:本地系统帐户,然后勾选允许服务与桌面交互。或转到 ServiceProcessInstaller 属性并将帐户设置为 LocalSystem。