我正在尝试将我的对象设置为远程服务器。我用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:找不到请求的服务”。
// 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 框架 4.5。