IPC プロトコルを使用して、プロセス間でメッセージを送信するチャネル実装を提供します。
まずはシンプルにコンソールで IPCチャネル を作ってみましょう。
こんな感じに、クライアント側からリモートオブジェクトのプロパティ Counter を操作すると、サーバー側のイベントが発報されてそのときの Counter の値をサーバー側で画面へ表示する、というようなプログラムにしてみます。
環境:
 
[図: プログラム構成]
(*) 「System.Runtime.Remoting」の参照追加を行う必要があります。
[プログラムソース "server.cs"]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
using IpcSample;
namespace Server
{
    class Program
    {
        private static IpcServer _ipcServer;
        static void Main(string[] args)
        {
            _ipcServer = new IpcServer();
            _ipcServer.remoteObject.counterChangeEvent += CounterChangeEventHandler;
            // メイン処理
            // 終了待ち
            Console.Write("HIT [Enter] KEY !! ");
            Console.ReadLine();
        }
        private static void CounterChangeEventHandler(object sender, EventArgs e)
        {
            Console.WriteLine("[CounterChangeEventHandler] Counter = " + _ipcServer.remoteObject.Counter);
        }
    }
    class IpcServer
    {
        public IpcRemoteObject remoteObject { private set; get; }
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public IpcServer()
        {
            // サーバーチャンネルの作成
            IpcServerChannel channel = new IpcServerChannel("IpcSample");
            // チャンネルを登録
            ChannelServices.RegisterChannel(channel, true);
            // リモートオブジェクトを生成して公開
            remoteObject = new IpcRemoteObject();
            RemotingServices.Marshal(remoteObject, "test", typeof(IpcRemoteObject));
        }
    }
}
	
(*) 「System.Runtime.Remoting」の参照追加を行う必要があります。
[プログラムソース "client.cs"]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
using IpcSample;
namespace Client
{
    class Program
    {
        private static IpcClient _ipcClient;
        static void Main(string[] args)
        {
            System.Threading.Thread.Sleep(2000);
            _ipcClient = new IpcClient();
            // メイン処理
            ThreadPool.QueueUserWorkItem(new WaitCallback(MethodTest));
            // 終了待ち
            Console.Write("HIT [Enter] KEY !! ");
            Console.ReadLine();
        }
        private static void MethodTest(Object obj)
        {
            for ( int i=0; i<3000; ++i)
            {
                Thread.Sleep(1000);
                _ipcClient.remoteObject.Counter++;
                Console.WriteLine("Counter = "+_ipcClient.remoteObject.Counter);
            }
        }
    }
    class IpcClient
    {
        public IpcRemoteObject remoteObject { private set; get; }
        public IpcClient()
        {
            // クライアントチャネルの作成
            IpcClientChannel channel = new IpcClientChannel();
            // チャンネルを登録
            ChannelServices.RegisterChannel(channel, true);
            // リモートオブジェクトを取得
            remoteObject = Activator.GetObject(typeof(IpcRemoteObject), "ipc://IpcSample/test") as IpcRemoteObject;
        }
    }
}
	
using System;
using System.Runtime.Remoting.Lifetime;
namespace IpcSample
{
    public class IpcRemoteObject : MarshalByRefObject
    {
        public delegate void CounterChangeEventHandler(object sender, EventArgs e);
        public event CounterChangeEventHandler counterChangeEvent;
        private int _counter;
        public int Counter {
            set {
                _counter = value;
                if ( counterChangeEvent != null)
                {
                    counterChangeEvent(this, new EventArgs());
                }
            }
            get {
                return _counter;
            }
        }
        public override Object InitializeLifetimeService()
        {
            // このオブジェクトのリース期限を無制限にします。 
            ILease lease = (ILease)base.InitializeLifetimeService();
            if (lease.CurrentState == LeaseState.Initial)
            {
                lease.InitialLeaseTime = TimeSpan.Zero;              // リース期限を無制限にします
                //lease.InitialLeaseTime = TimeSpan.FromSeconds(15); // リース期限を15秒にします
            }
            return lease;
        }
    }
}
	
サンプルダウンロード は こちら。
本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。
| 2023-04-19 | - | ページデザイン更新 | 
| 2015-12-06 | - | 新規作成 |