3

我正在尝试将我的对象设置为远程服务器。我用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。

4

0 回答 0