2013-02-04 48 views
1

我正在使用命名管道在使用.Net 3.5的两个进程之间进行通信。这在Windows 7上工作正常,但不知何故不在Windows XP下。在Windows XP和.Net 3.5上使用NamedPipes时出现InvalidOperationException异常

我在那里得到一个InvalidOperationException。这里是我翻译德文信息的尝试:“Pipe handle尚未设置,您的PipeStream实现是否调用InitializeHandle?

我创建了一个测试项目是: http://www.chinery.de/dateien/NamedPipeTest.zip

在应用程序中,你可以点击“连接”,将看到管道的名称。在右侧,如果一切顺利,您可以输入将通过管道发送的消息。

正如我所说,这个问题只出现在Windows XP上。

有没有人有这方面的线索?

+1

我设法得到这个异常做了一些愚蠢的事情:我试图在调用NamedPipeClientStream.Connect()之前指定NamedPipeClientStream.ReadMode。 – RenniePet

回答

1

我终于找到了解决方案。这是管道客户端创建:

NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost", PipeName, PipeDirection.InOut) 

我不得不这样更改为: NamedPipeClientStream pipeClient =新NamedPipeClientStream( “”,PipeName,PipeDirection.InOut)

(更改服务器名称从 “本地主机”到“。”)

这在某种程度上适用于Windows 7,但不适用于XP。现在它终于在两个系统上运行。

+0

所以我试图解决一个类似的问题,与Win 7上的C#客户端和C + +服务器,我必须使用本地主机。如果我使用'“。”',则创建'NamedPipeClientStream'。太奇怪了! – PfunnyGuy

0

它可能有权限问题:所以需要提供所需的访问权限。

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。

相关问题