2013-02-04 47 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。

相關問題