如何为不是从MarshalByRefObject派生的远程对象创建代理?

时间:2009-09-02 07:51:08

标签: c# .net remoting

在AppDomain A中,我有o类型的对象TT既不是Serializable,也不是MarshalByRefObject。类型T由我无法控制的插件主机提供。

我想创建一个AppDomain B并将代理传递给oB中的方法,但我很难过:如何创建代理?

B中的方法应该能够调用o上的方法并读取属性等。这些方法的结果必须以类似的方式进行代理。

3 个答案:

答案 0 :(得分:5)

我建议您创建一个正确的代理对象,该对象实现与您尝试代理的对象相同的接口,并且还继承自MarshalByRefObject。然后,您远程代理对象。在服务器端,代理将委托给您的对象。

根据您的要求,服务器对象将您的对象包含为静态(所有客户端看到相同的对象)或非静态(每个客户端获取新副本)。

对于静态成员,您需要在服务器中创建代理并使用您的对象初始化它,或者第一个分配的代理(在第一个客户端连接时)创建您的对象并自行初始化。我用过前者。

当然不要忘记租约。

答案 1 :(得分:3)

如果您需要代理,最好的办法可能是将对象封装在 继承自MarshalByRefObject的类型中(作为私有字段) ),并有公共方法等使其可用;一个外观,基本上。

如果你想要序列化 ​​- 我会使用与对象相关的的DTO,但是使用不同的(可序列化)类型。只需发送状态,然后在另一端重建实际类型。

答案 2 :(得分:2)

你做不到。在AppDomains之间进行通信的唯一方法是使用代理或使用副本(即可序列化)。

您可以将您的类型包装在继承自MarshalByRefObject的代理中并使用它吗?