Take a look at .Net remoting. This is a bit more modern than SendMessage, but not so much. It is pretty easy to use, though. I think the official way to do this these days probably uses WCF, but I'm sure it is exactly the same under the hood.
.Net remoting supports various channels (Http, TCP), but in your case, I suggest removing IPC. It sits on top of named pipes.
Probably the easiest way is if you are google (.Net remoting), but the general idea is to define a class in your "server" application derived from MarshalByRefObject. Once you have done this, register it using the remote infrastructure using RemotingConfiguration.RegisterWellKnownServiceType.
Then, your client application can instantiate the class using Activator.CreateObject, and then you will be fine.
One thing you need to know about: it looks like you will need a callback mechanism, so your dashboard will not be blocked waiting for your WorkerApp. This is supported in removing the .Net network, but you need to create two channels - one for outgoing calls (from Dashboard to WorkerApp), and then another for incoming callbacks.
Another suggestion: your working class (the one derived from MarshalByRefObject) will be easier to handle if you also discover the interface. Put this interface in the DLL, accessible for both applications, and life will be easier.
source share