Ohad's Blog

Lets talk about .net !

Mirror at:
blogs.microsoft.co.il

News

         Ohad Israeli's Facebook profile

Grab this badge here!

C# Code Snippts

Favorite Blogs

Israeli .Net Bloggers

Using Remoting IpcChannel in Framework 2.0

Using the new remoting IPC Channel is easy ! 

The remote object will look the same as before…. no changes at all…

On the server and client follow these steps :

1. Add a reference to System.Runtime.Remoting.Channels.Ipc
2. Add a using statement to System.Runtime.Remoting.Channels.Ipc
3. Replace your old TcpChannel objects with the new IpcChannel objects.
    When you declare an IpcChannel using IpcChannel("Server")
     
you are actually creating a named pipe.
4. Point the client to where the named pipe is located :  "ipc://Server/RemotingServer"

If you were working with Config files… its all about changing them…
no need to even touch one line of code…
Check Daniel Moth blog (thanks Daniel)

I’ve left commented the old TcpChannel  decleration (in gray) just to point out that it isn’t a realy hard work to do.

Sample Code:
Sample Remote Object

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;

namespace
RemotingSample
{
     public class RemoteObject : MarshalByRefObject
    {
        //////////////////////////////////////////////////////////////////////////////
       
///constructor
        public RemoteObject()
        {
            Console.WriteLine("Remote object activated");
        }
        //////////////////////////////////////////////////////////////////////////////
        ///return message reply
        public String ReplyMessage(String msg)
        {
            Console.WriteLine("Client : " + msg);//print given message on console
            return "Server : I'm alive !";
        }
    }
}

Sample Remote Server
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
//using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Ipc;
namespace RemotingSample
{
    public class Server
    {
        /////////////////////////////////////////////////////////////////////////////
        ///constructor
        public Server()
        {}
        /////////////////////////////////////////////////////////////////////////////
        ///main method
        public static int Main(string[] args)
        {
            //select channel to communicate
            //TcpChannel chan = new TcpChannel(8085);
            IpcChannel chan = new IpcChannel("Server");
            //register channel
            ChannelServices.RegisterChannel(chan);
            //register remote object
            RemotingConfiguration.RegisterWellKnownServiceType(
                  
Type.GetType("RemotingSample.RemoteObject,RemoteObject"),
                   "RemotingServer",
                   WellKnownObjectMode.SingleCall);
             //inform consol
             Console.WriteLine("Server Activated");
             Console.ReadLine();
             return 0;
         }
    }
}

Sample Remote Client
using
System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
//using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Ipc;
using RemotingSample;
namespace RemotingSample
{
    public class Client
    {
        /////////////////////////////////////////////////////////////////////////////
        ///constructor
        public Client()
        {}
        //////////////////////////////////////////////////////////////////////////////
        ///main method
        public static int Main(string[] args)
        {
            //select channel to communicate with server
            //TcpChannel chan = new TcpChannel();
            IpcChannel chan = new IpcChannel("Client");
            ChannelServices.RegisterChannel(chan);
            RemoteObject remObject = (RemoteObject)Activator.GetObject(
                        typeof(RemotingSample.RemoteObject),
                        //"tcp://localhost:8085/RemotingServer");
                        "ipc://Server/RemotingServer");
            if (remObject == null)
                   Console.WriteLine("cannot locate server");
            else
                   remObject.ReplyMessage("You there?");
            return 0;
        }
    }
}

Comments

Daniel Moth said:

And if you want to do it via config files, you don't have to change a line of code :-)
http://www.danielmoth.com/Blog/2004/09/ipc-with-remoting-in-net-20.html
# January 4, 2005 7:17 AM

Ohad Israeli said:

Just updated the blog... with your comment....
# January 4, 2005 9:10 AM

Kamalesh said:

Hi,

I wanted to know that can I use IPC Channel over remote machines? I mean if I configure remoting using IPC, ie ipc://Server/RemotingServer to host the remote obj in windows service on same machine. But later on decide that I want to host the remote object on other machine. Will framework automatically detect and change mode to TCP/IP or http? Seems difficult as ipc is configured with just the named pipe name, no server name. How will it locate the remote server?

Vice versa if I use tcp ip windows service host and configure using tcp://remoteServerIP:8085/RemotingServer. but later if the server is the same machine as client, shall the framework detect automatically and use IPC?
# January 18, 2005 9:27 PM

Michael Kariv said:

Did you ever experienced "all pipes are busy" with the IPCChannel? Do you know what could have been the reason?
# May 31, 2006 11:06 AM

Ohad Israeli said:

I haven't experianced it but check the following kb which may help:
http://support.microsoft.com/default.aspx?scid=kb;en-us;170338
# May 31, 2006 12:00 PM

Sloan said:

Ohad,

This post is great.  My only quip is there anyway to rename some of the items to non-ambigious names.

IpcChannel("Server")

ipc://Server/RemotingServer

IpcChannel chan = new IpcChannel("Server");

ipc://Server/RemotingServer

I'm kinda getting lost in the shuffle there.

Something along the lines of:

MyNamedPipeName

MyRemoteServerUri

It's not necessarily your code sample, but rather when I try to map the values to the config file using the other link.

Thanks.

# July 31, 2007 7:35 PM

Peter N. said:

Thanks, this simple piece of information was remarkably hard to find, and was exactly what I needed.

Before, I was using TcpChannel for IPC between processes on the same machine, and having problems with firewall pop-ups.

One thing I don't understand (both in this version and the Tcp version): why are two channel names (or ports) needed?  When is the client one ever used?  My metaphor would be two processes agreeing to communicate over the same channel.

Thanks again.

# October 22, 2007 12:16 PM

JB said:

Hi,

I started playing with Ipc channels and expereince some problem.

I found sample blogs.msdn.com/.../571020.aspx

of Remoting and events, however with TCP. I updated it to IpcChannel ( as u in yor sample) but :-(  ...    client never catch the event raised by server (I have server.exe and client.exe console apps).

# April 27, 2008 7:06 AM

Projections said:

When I'm working with a new technology or concept, I find that an ultra simple, bare bones code sample

# August 1, 2008 8:01 PM

a-foton » Using IPC Channels and with Multiple Users said:

Pingback from  a-foton » Using IPC Channels and with Multiple Users

# August 1, 2008 8:37 PM

Pregnant Man » Using IPC Channels and with Multiple Users said:

Pingback from  Pregnant Man » Using IPC Channels and with Multiple Users

# August 1, 2008 8:52 PM

Using IPC Channels and with Multiple Users said:

Pingback from  Using IPC Channels and with Multiple Users

# August 1, 2008 9:16 PM

Using IPC Channels and with Multiple Users said:

Pingback from  Using IPC Channels and with Multiple Users

# August 1, 2008 10:23 PM

Interprozesskommunikation | hilpers said:

Pingback from  Interprozesskommunikation | hilpers

# January 20, 2009 11:18 AM
Leave a Comment

(required) 

(required) 

(optional)

(required)