delete from hateblo.jp where 1=1;

タイトルに意味はありません。

IPCについてのあれこれ

対象

本記事は以下のかわいそうな人向けのメモです。

  • IPCにてクライアント・サーバー通信を実現しようとしている
  • できないことなどで苦しんでいる

まさに俺。

お約束

本記事におけるIPCとは、.NET frameworkにおけるSystem.Runtime.Remoting名前空間のIpc*Channelクラスを用いたプロセス間通信を指します。
IISを用いた実装などについてはほかの記事をご参照ください。

注意

MicrosoftからSystem.Runtime.Remoting名前空間のIpc*Channelクラスは非推奨でWCF(Windows Communication Framework)を使うように案内があるので、立ち位置に困っています。「要出典」

できること

  • クライアントからサーバーAPIをコールし、その戻り値を取得することができる
  • サーバーAPI引数にoutがあっても取り出せる
  • マルチスレッドで単一インスタンス(サーバー)に対してアクセスができる
  • 透過的に扱うことができる

できないこと

  • サーバーからクライアントのAPIをコールすること
  • クライアント側でイベント登録ができない
  • コールバックの実装はほぼできない
  • ref演算子など、呼び出し中に値が変わるものは、APIコール時に確定し、変更することができない(例:引数による動作変更)
  • Serialize可能なクラスのみ
  • サーバーとの切断をAPI呼び出し時の例外でしか確認できない

安易な実現方式1

  1. サーバーがサーバーになって、クライアントがクライアントになる。
  2. クライアントがサーバーになって、サーバーがクライアントになる。

これで、解決と思ったが、まだ早かった。
続きは気が向いたら書く

参考文献