プロセス間通信(IPC)は複数のプログラム(プロセス)間で情報をやりとりするための仕組みです。
.NET Frameworkには.Netリモーティングというプロセス間通信の機能がありますので、それを使用することで簡単にプロセス間通信を行うとができます。
通信の方式はTCP, HTTP, IPC と3種類の通信方式から選択することができます。同一マシン上でのプロセス間通信を行う場合、IPCチャンネルを使用します。
まずはMSDNのサンプルコードを元に簡単なプロセス間通信を実現してみます。
Imports System.Runtime.Remoting Imports System.Runtime.Remoting.Channels Imports System.Runtime.Remoting.Channels.Ipc Namespace IpcSample Class IpcServer Public Property RemoteObject() As IpcRemoteObject ''' <summary> ''' コンストラクタ ''' </summary> Public Sub New() ' サーバーチャンネルの生成 Dim channel As New IpcServerChannel("ipcSample") ' チャンネルを登録 ChannelServices.RegisterChannel(channel, True) ' リモートオブジェクトを生成して公開 RemoteObject = New IpcRemoteObject() RemotingServices.Marshal(RemoteObject, "test", GetType(IpcRemoteObject)) End Sub End Class End Namespace
※プログラムで参照設定で「System.Runtime.Remoting」を追加する必要があります。
Imports System.Runtime.Remoting Imports System.Runtime.Remoting.Channels Imports System.Runtime.Remoting.Channels.Ipc Namespace IpcSample Class IpcClient Public Property RemoteObject() As IpcRemoteObject ''' <summary> ''' コンストラクタ ''' </summary> Public Sub New() ' クライアントチャンネルの生成 Dim channel As New IpcClientChannel() ' チャンネルを登録 ChannelServices.RegisterChannel(channel, True) ' リモートオブジェクトを取得 RemoteObject = TryCast(Activator.GetObject(GetType(IpcRemoteObject), "ipc://ipcSample/test"), IpcRemoteObject) End Sub End Class End Namespace
※プログラムで参照設定で「System.Runtime.Remoting」を追加する必要があります。
Namespace IpcSample Public Class IpcRemoteObject Inherits MarshalByRefObject Public Property Counter() As Integer End Class End Namespace
サーバー側プログラムで IpcServer のインスタンスを生成し、クライアント側のプログラムで IpcClient を生成します。
それぞれ別々プロセスで動作していますが、各クラスのプロパティ RemoteObject は同じインスタンスを共有しているようなイメージになります。
また、クライアント側は複数生成することができ、1対多で RemoteObject を共有することができます。
ここまでは簡単なのですが、これらのサンプルには下の問題が発生する場合がありますので、下のページも確認して下さい。