2017-12-19 26 views
0

.Net에서 IPC 응용 프로그램을 개발하는 데 어려움을 겪고 있습니다. 이미 .Net을 사용하여 하나의 응용 프로그램을 작성했지만 내 배포 환경은 우분투이므로 .net 코어에서 .net 코드를 다시 작성합니다. 우분투에서 나는 [DllImport("kernel32.dll", SetLastError = true)]을 쓸 수 없으므로 하나의 메커니즘 파이프를 발견했습니다. 기존 코드에서 파이프를 구현하는 데 어려움을 겪고 있습니다. 내가C#에서 명명 된 파이프를 구현하는 방법은 무엇입니까?

clientHandle =CreateNamedPipe(this.pipeName,DUPLEX | FILE_FLAG_OVERLAPPED,0,255,BUFFER_SIZE,BUFFER_SIZE,0,IntPtr.Zero);` 

같은 방법 listenforclients이 사용하고 현재 내가

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern SafeFileHandle CreateNamedPipe(
    String pipeName, 
    uint dwOpenMode, 
    uint dwPipeMode, 
    uint nMaxInstances, 
    uint nOutBufferSize, 
    uint nInBufferSize, 
    uint nDefaultTimeOut, 
    IntPtr lpSecurityAttributes); 

으로 파이프를 만드는 오전 나는이 오류 pipeserver 결과이

NamedPipeServerStream pipeServer = new NamedPipeServerStream("_PipeName",PipeDirection.InOut,2,PipeTransmissionMode.Message,PipeOptions.None); 
clientHandle = pipeServer(this.pipeName, DUPLEX | FILE_FLAG_OVERLAPPED, 0, 255, BUFFER_SIZE, BUFFER_SIZE, 0, IntPtr.Zero); 

이 방법처럼 사용할 수 없습니다 시도했다. 누군가가 위의 올바른 방법을 서면으로 나를 도울 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다. 고맙습니다.

답변

0

pipeServer는 스트림입니다. 방법과 같이 호출 할 수 없습니다. 당신은 이런 식으로 직렬화해야합니다

pipeServer.WaitForConnection(); 
Serializer.Serialize(pipeServer, ...); 
pipeServer.Disconnect(); 

당신은 예를 들어 here을 볼 수 있습니다.

이 예제에서는 ProtoBuf을 사용합니다. 거기에서 직렬화기를 가져옵니다. 직렬화하려는 클래스를 꾸밀 필요가있다.

+0

도움 주셔서 감사합니다. serializer가 컨텍스트에 존재하지 않는 것은 내가 얻는 첫 번째 오류입니다. 대신에 ... 내가 뭘 써야 할까? 또한 int 성공 = ConnectNamedPipe (clientHandle, IntPtr.Zero); 이 곳에서 나는 무엇을 써야 하나? –

+0

@Niranjan Godbole : 답변에 더 많은 정보를 추가했습니다. 그것은 명명 된 파이프 통신을하는 방법이지만, 당신의 예를 들어 맞는지 정말로 말할 수는 없습니다. –

+0

도움을 주셔서 감사합니다. 나는 다른 것을 들여다 보겠다. –