最新の更新情報

2012年2月
« 1月    
 1234
567891011
12131415161718
19202122232425
26272829  

本ブログのURL

qrcode.png

雨雲の動き

お天気

 
 
吟遊詩人の戯言 内専用の記事検索...
 
 

C#での自PC内プロセス間通信


キーワード(クリックで関連記事が読めます) → , ,

関連記事



 
 

またまた,必要に迫られて実装をば...

最初,Localhostに対して,ソケットで通信しようかと思いましたが...
Net Frameworkに,便利なクラスが追加されているそうで

    IpcServerChannelクラス
    IpcClientChannelクラス

を使えば,さくっとプロセス間通信,実装できましたです

なお,こちらのページを参考にしました
あわせて,御確認ください

[C#][Program]C# .NETリモーティングを使ったプロセス間通信@tetsuarossa
[C#][Program]C# .NETリモーティングを使ったプロセス間通信 その2@tetsuarossa

tetsuarossaさま,サンクスです :smile:



【追記:09/04/15】

ここに記載したコード,サンプルプロジェクトとして,丸ごとアップしておきます
ダウンロードは,こちら@C#
ご自由にお使いくださいませ!

なお,バグってたら,すまんでごわす :mrgreen:



1.System.Runtime.Remotingを参照設定(サーバ側クライアント側両方で,です)
2.下記コードを Using追加する(サーバ側クライアント側両方で,です)
なお,RemoteTranceObjectネームスペースが情報共有クラスとなります
C#:
  1. using System.Runtime.Remoting.Channels.Ipc;
  2. using System.Runtime.Remoting.Channels;
  3. using System.Runtime.Remoting;
  4. using RemoteTranceObject;


3.情報共有を行うRemoteTranceObjectネームスペースの定義
サーバー,クライアント,同一の定義が必要です.
この部分だけ,クラスDLLにして,参照設定しちゃうほうが,あとあと管理が楽かも?
今回は制御モード(int)と,怪しい文字列(string)をクライアント側からサーバ側へ伝送させます
C#:
  1. namespace RemoteTranceObject  //共有オブジェクト(サーバー/クライアントで全く同一内容で定義してください)
  2. {
  3.     public class ClassFileInfo : MarshalByRefObject
  4.     {
  5.         public class ClassFileInfoEventArg : EventArgs            //情報を引き渡すイベント引数クラス
  6.         {
  7.             private int m_mode = 0;                    //モード
  8.             private string m_FileName = "";            //文字列
  9.  
  10.             public int Mode { get { return m_mode; } set {m_mode = value;}}
  11.             public string FileName { get { return m_FileName; } set {m_FileName = value;}}
  12.  
  13.             public ClassFileInfoEventArg(int tmpMode, string tmpfName)
  14.             {
  15.                 m_mode = tmpMode;
  16.                 m_FileName = tmpfName;
  17.             }
  18.         }
  19.  
  20.         public delegate void CallEventHandler(ClassFileInfoEventArg e);
  21.         public event CallEventHandler OnTrance;
  22.            
  23.         public void DataTrance(int tmpmode, string tmpfname)
  24.         {
  25.             if (OnTrance != null)
  26.             {
  27.                 OnTrance(new ClassFileInfoEventArg(tmpmode, tmpfname));
  28.             }
  29.         }
  30.        
  31.     }
  32. }


4.サーバー側の実装
普通のWindowsフォームアプリのプロジェクト作って
ラベル1個と,リストボックス1個を貼り付けました
クライアントから送られてきた情報は,リストボックスに追加されていきます
C#:
  1. namespace ProTestServer
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.         private ClassFileInfo m_msg;
  6.  
  7.         //コンストラクタ
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.         }
  12.  
  13.         //フォームロード
  14.         private void Form1_Load(object sender, EventArgs e)
  15.         {
  16.             //このチャネル生成系は一度通せばいいっぽい
  17.  
  18.             // IPC Channelを作成
  19.             IpcServerChannel servChannel = new IpcServerChannel("processtrancetest");
  20.            
  21.             // リモートオブジェクトを登録
  22.             ChannelServices.RegisterChannel(servChannel, true);
  23.  
  24.             //// ChannelのURIを表示
  25.             label1.Text = servChannel.GetChannelUri();
  26.  
  27.             // イベントを登録
  28.             m_msg = new ClassFileInfo();
  29.  
  30.             m_msg.OnTrance += new ClassFileInfo.CallEventHandler(m_msg_OnTrance);
  31.  
  32.             RemotingServices.Marshal(m_msg, "message", typeof(ClassFileInfo));
  33.         }
  34.  
  35.         //クライアントから転送されてきた情報をリストボックスに表示
  36.         void m_msg_OnTrance(ClassFileInfo.ClassFileInfoEventArg e)
  37.         {
  38.             string st;
  39.  
  40.             switch(e.Mode)
  41.             {
  42.                 case 1:
  43.                     st = "モード1";
  44.                     break;
  45.                 case 2:
  46.                     st = "モード2";
  47.                     break;
  48.                 case 3:
  49.                     st = "モード3";
  50.                     break;
  51.                 default:
  52.                     st = "???";
  53.                     break;
  54.             }
  55.  
  56.  
  57.             listBox1.Items.Add(st + " , " + e.FileName);
  58.         }
  59.     }
  60. }


5.クライアント側の実装 こちらも普通のWindowsフォームアプリにて
ラジオボタン3つ,テキストボックス1個,ボタン1個を貼り付けてください
ボタンを押すたびに,サーバ側へ情報伝送します
あと,3つのラジオボタンのTagプロパティに1~3の数値を設定してあります
C#:
  1. namespace ProTestClient
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.         private int m_mode;
  6.         private ClassFileInfo m_msg = null;
  7.  
  8.         //コンストラクタ
  9.         public Form1()
  10.         {
  11.             InitializeComponent();
  12.  
  13.             m_mode = 1;
  14.         }
  15.  
  16.         //フォームロード
  17.         private void Form1_Load(object sender, EventArgs e)
  18.         {
  19.             //このチャネル生成系は一度通せばいいっぽい
  20.            
  21.             // IPC Channel を作成
  22.             IpcClientChannel clientChannel = new IpcClientChannel();
  23.  
  24.             // リモートオブジェクトを登録
  25.             ChannelServices.RegisterChannel(clientChannel, true);
  26.  
  27.             // オブジェクトを作成
  28.             m_msg = (ClassFileInfo)Activator.GetObject(typeof (ClassFileInfo), "ipc://processtrancetest/message");
  29.  
  30.         }
  31.  
  32.         //ラジオボタンでモードを設定
  33.         private void rdbClick(object sender, EventArgs e)
  34.         {
  35.  
  36.             string st = (sender as RadioButton).Tag as string;
  37.  
  38.             m_mode = int.Parse(st);
  39.  
  40.         }
  41.  
  42.         //ボタンを押すたびに,モードと入力文字をサーバ側へ送信
  43.         private void button1_Click(object sender, EventArgs e)
  44.         {
  45.             string st = textBox1.Text;
  46.  
  47.             if (st == "")
  48.             {
  49.                 st = "空文字";
  50.             }
  51.  
  52.             m_msg.DataTrance(m_mode, st);                //サーバーへ伝送
  53.         }
  54.  
  55.     }
  56. }


クライアント側 ClassFileInfo.DataTrance() を呼び出すたびに
サーバ側で,デリゲートが呼び出される仕組みです

情報共有クラスにプロパティを追加すれば
サーバ側で,設定した値をクライアントでも,読み出せるはず,です(汗

また,私自身がどこかで使うかもしれないので
ここに記載しておきますです...


 
 
 
 

4 comments to C#での自PC内プロセス間通信

  • 通りすがり

    ありがとうございました。とても参考になりました。 :wink: なかなか form 形式での sample が見つからなかったので。
    蛇足かもしれませんが 2 の所の using System.Runtime.Remoting の部分で、ソリューションエクスプローラで各 exe の参照設定に System.Runtime.Remotingを追加しないと私の場合ビルドエラーになってしまいました。
    重ねてありがとうございます。参考になりました。

  • >>通りすがり さま

    ようこそ!
    参考になったみたいで,よかったです

    参照設定の件,(1)にちょろっと,書いてありますです
    見落とされたかな?? :wink:

    また,面白そうなコードが出てきたら,ここに記載していきますです :smile:

  • たけぞ

    Tag値のとり方がわからず、ここへたどり着きました。ありがとうございましたー。

  • >>たけぞ さま

    助けになったみたいで,よかったです
    また,面白いTipsを書ければと思いますです♪

コメントを残す

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">