I have a service which needs to pump strings to a helper application which displays critical messages from the service to the user (Vista+ does not give services access to the GUI). Since I've used .NET Remoting over TCP, I figured I'd do the same with the IPC protocol. However, after getting the reference to the remote object, I get the following exception when making a call to the remote method:
MissingMethodException: No parameterless constructor defined for this object.
Simply adding a parameterless constructor to the class gives me a NullReferenceException when making the call instead. What is it that I am doing wrong? I've included my relevant code below:
Application Code
public class MyMsgBus : MarshalByRefObject, IDisposable, IMxServeBus
{
private Thread myThread = null;
private volatile List<string> myMsgBus = null;
private volatile bool myThreadAlive = false;
private volatile bool myIsDisposed = false;
private volatile bool myIsDisposing = false;
private IpcChannel myIpc = null;
public MyMsgBus(string busname)
{
myMsgBus = new List<string>();
myIpc = CreateIpcChannel(busname);
ChannelServices.RegisterChannel(myIpc);
var entry = new WellKnownServiceTypeEntry(
typeof(MxServeBus),
"MyRemoteObj.rem",
WellKnownObjectMode.Singleton);
RemotingConfiguration.RegisterWellKnownServiceType(entry);
}
// defined in IMyMsgBus
public void SendMessage(string message)
{
// do stuff
}
public static IpcChannel CreateIpcChannel(string portName)
{
var serverSinkProvider = new BinaryServerFormatterSinkProvider();
serverSinkProvider.TypeFilterLevel = TypeFilterLevel.Low;
IDictionary props = new Hashtable();
props["portName"] = portName;
props["authorizedGroup"] = "Authenticated Users";
return new IpcChannel(props, null, serverSinkProvider);
}
public static IpcChannel CreateIpcChannelWithUniquePortName()
{
return CreateIpcChannel(Guid.NewGuid().ToString());
}
}
Test Client
static void Main(string[] args)
{
var channel = MyMsgBus.CreateIpcChannelWithUniquePortName();
ChannelServices.RegisterChannel(channel, true);
var objUri = "ipc://MyMsgBus/MyRemoteObj.rem";
IMyMsgBus lBus = (IMyMsgBus)Activator.GetObject(typeof(IMyMsgBus), objUri);
lBus.SendMessage("test");
Console.WriteLine();
}
Thanks in advance for any assistance on this. As an FYI, this is a remoting instance configured through the use of a shared interface, where IMyMsgBus defines the methods which should be available to call over IPC.