我正在尝试将我的对象设置为远程服务器。我为此使用了RemotingServices.Marshal(myObj, uri)
。我有以下代码:
public class IpcRemoteObject : MarshalByRefObject
{
public void Register()
{
var channel = new IpcChannel("ipcSample");
ChannelServices.RegisterChannel(channel, false);
RemotingServices.Marshal(this, "test", typeof(IpcRemoteObject));
Console.WriteLine("Created server, waiting for calls");
Console.ReadLine();
}
}
如果我从我的程序的Main()中调用它,如下所示,一切正常:
// case 1: works
new IpcRemoteObject().Register();
但是,如果我在下面的另一个AppDomain中创建对象,则从客户端连接时会收到“RemotingException:Requested Service not found”。
// case 2: completes without error, but client connections fail
var appDomain = AppDomain.CreateDomain("foo");
var remoteObj = (IpcRemoteObject)appDomain.CreateInstanceAndUnwrap(assembly, typename);
remoteObj.Register();
然后,如果我创建一个代表我调用Register()并在另一个appdomain中实例化该类的中间类,那么一切都恢复正常:
// case 3: works
class Bootstrapper : MarshalByRefObject
{
public void Register()
{
new IpcRemoteObject().Register();
}
}
...
var appDomain = AppDomain.CreateDomain("foo");
var bootstrapper = (Bootstrapper)appDomain.CreateInstanceAndUnwrap(
bootstrapperAssembly, bootstrapperType);
bootstrapper.Register(); // works
所以,这是一个问题:为什么RemotingServices.Marshal()
在案例2中不起作用?是否存在某种规则,还是仅仅是远程处理中的错误?我正在使用.NET framework 4.5。