在AppDomain A
中,我有o
类型的对象T
。 T
既不是Serializable
,也不是MarshalByRefObject
。类型T
由我无法控制的插件主机提供。
我想创建一个AppDomain B
并将代理传递给o
到B
中的方法,但我很难过:如何创建代理?
B
中的方法应该能够调用o
上的方法并读取属性等。这些方法的结果必须以类似的方式进行代理。
答案 0 :(得分:5)
我建议您创建一个正确的代理对象,该对象实现与您尝试代理的对象相同的接口,并且还继承自MarshalByRefObject。然后,您远程代理对象。在服务器端,代理将委托给您的对象。
根据您的要求,服务器对象将您的对象包含为静态(所有客户端看到相同的对象)或非静态(每个客户端获取新副本)。
对于静态成员,您需要在服务器中创建代理并使用您的对象初始化它,或者第一个分配的代理(在第一个客户端连接时)创建您的对象并自行初始化。我用过前者。
当然不要忘记租约。
答案 1 :(得分:3)
如果您需要代理,最好的办法可能是将对象封装在 继承自MarshalByRefObject
的类型中(作为私有字段) ),并有公共方法等使其可用;一个外观,基本上。
如果你想要序列化 - 我会使用与对象相关的的DTO,但是使用不同的(可序列化)类型。只需发送状态,然后在另一端重建实际类型。
答案 2 :(得分:2)
你做不到。在AppDomains之间进行通信的唯一方法是使用代理或使用副本(即可序列化)。
您可以将您的类型包装在继承自MarshalByRefObject
的代理中并使用它吗?