28774
C#で作成したアプリ同士の通信に、普段TCP/IPを使用して  
電文をやりとりしていますが  
同一PC内でアプリ間で通信をするさい、  
C#では、何を使用するのが一般的なのでしょうか

理想を言えば  
A.exe/B.extがあった場合に  
A.extからB.exeの内部の関数(イベント)をコール出来れば理想的ではあるのですが
CC BY-SA 3.0
2016-09-09T03:28:55.050
28773
2016-09-09T11:52:26.863
15047
question
c# .net tcp
C#で作成したアプリ同士の通信
一般的かどうかは分かりませんが、私ならWCF ([Windows Communication
Foundation](https://msdn.microsoft.com/ja-
jp/library/ms731082\(v=vs.110\).aspx))を使用します。  
バインディングに名前付きパイプを使用し、コールバックコントラクトを定義すれば簡単に型付きで双方向通信が実装可能です。

まず関係プロジェクトに`System.ServiceModel.dll`の参照を追加してから、通信に使用するインターフェイスを定義します。この時型には`ServiceContractAttribute`を、メソッドには`OperationContract`を指定します。

```

    // using System.ServiceModel;
    // ホスト側
    [ServiceContract(CallbackContract = typeof(ICallback))]
    internal interface IHost
    {
        [OperationContract(IsOneWay = true)]
        void SendHost(string message);
    }
    
    // クライアント側
    [ServiceContract]
    internal interface ICallback
    {
        [OperationContract(IsOneWay = true)]
        void SendClient(string message);
    }
    
```

次に、各インターフェイスを実装します。

```

    public class Host : IHost
    {
        public void SendHost(string message)
        {
            Console.WriteLine("Host received: " + message);
    
            // 双方向通信でコールバックを取得するには以下を実行する。
            var callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            callback.SendClient(message.Length + " chars");
        }
    }
    
    class Callback : ICallback
    {
        public void SendClient(string message)
        {
            Console.WriteLine("Client received: " + message);
        }
    }
    
```

それからどちらかのプロセスでサービスをホストします。

```

    const string addr = "net.pipe://localhost/wcfInterProcessCommunication";
    var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
    var sh = new ServiceHost(typeof(Host));
    sh.AddServiceEndpoint(typeof(IHost), binding, addr);
    sh.Open();
    
```

もう一方のプロセスでは同じアドレスとバインディングを指定してサービスに接続します。

```

    const string addr = "net.pipe://localhost/wcfInterProcessCommunication";
    var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
    var host = DuplexChannelFactory<IHost>.CreateChannel(new InstanceContext(new Callback()), binding, new EndpointAddress(addr));
    
```

このように接続を確立すれば、後は上のコードでいう`host`/`callback`を通常のC#オブジェクトのような感覚で操作することが可能になります。
CC BY-SA 3.0
2016-09-09T03:34:40.033
28774
2016-09-09T11:52:26.863
2016-09-09T11:52:26.863
5750
5750
28773
answer