2017-12-19 18 views
0

私は.NetでIPCアプリケーションを開発するのに苦労しています。私はすでに.Netを使って一つのアプリケーションを書いていましたが、私の展開環境はUbuntuなので、.netコアで.netコードを書き直しています。 ubuntuで私は[DllImport("kernel32.dll", SetLastError = true)]を書くことができないので、私は1つのメカニズムパイプを見つけた。私は既存のコードでパイプを実装するのに苦労しています。現在、私は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

ご協力いただきありがとうございます。シリアライザはコンテキスト内に存在しませんが、私が得ている最初のエラーです。次の代わりに...私は何を書くべきですか?また、私はint成功= ConnectNamedPipe(clientHandle、IntPtr.Zero);私はこの場所で何を書くべきですか? –

+0

@Niranjan Godbole:答えにさらに情報を追加しました。これは名前付きパイプ通信を行う方法ですが、あなたの例に合っているかどうかは実際には言えません。 –

+0

助けてくれてありがとう。私は別のものを調べる –

関連する問題