VB.NET プロセス間通信(IPC)

[English]

プロセス間通信(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 を共有することができます。

ここまでは簡単なのですが、これらのサンプルには下の問題が発生する場合がありますので、下のページも確認して下さい。

使用環境: Visual Studio 2010 .NET Framework 4