2012-11-21 18 views
4

我使用RemotingServices.MarshalActivator.GetObject来建立驻留在同一台计算机上的两个简单程序之间的远程通道。.NET Remoting,为什么不是一个远程的列表?

public class IpcInterface : MarshalByRefObject 
{ 
    public int number = -1; 
    public string text = "default"; 
    public List<String> strings; 
} 
// A simplification 

我已经证实了信道存在与沟通是可能的,因为这两个项目都成功改变numbertext完全独特的值(确认)。

所以我立即尝试做相同的strings

在一个程序上,我拨打了strings.Add("1")。我试着在第二个程序上阅读strings的内容。这是。此外,计数为0。我不知道为什么strings继续有0对象,就像我从来没有添加过它们一样。同样的事情发生在Stack<T>Dictionary<T, K>,我只是不能添加任何元素。为了确保一般的参考类型不会出现奇怪现象,我也尝试在IPC接口类中添加一个StringBuilder,并且在两个程序中都成功维护'状态',以更改其值。

问题:为什么不添加字符串列表,以及解决方案是什么?

我希望有经验的人可以马上发现这个问题。我尝试了谷歌类似的问题,但我没有得到任何有用的结果。令人惊讶的是,我只有1个好的链接,用于搜索“调试.net远程处理透明代理”。这也是我的第二个问题。我如何调试透明代理对象?

  1. 所有对象都正确实例化(没有NullReferenceException;实际上,没有例外)。

回答

8

问题是List<T>本身并不是一个MarshalByRefObject,相反,它是一个序列化的类。当你在你的列表中调用Add()方法时,你实际上做的是要求远程对象对其列表进行序列化,在本地进行反序列化,然后在本地对象上调用该方法。您的更改永远不会传播回列表对象的远程实例。

您将不得不在您的IpcInterface类中提供操作列表的方法;由于此类型继承自MarshalByRefObject,因此将在远程对象上调用这些方法,而不是本地反序列化的实例。

public class IpcInterface : MarshalByRefObject { 
    public List<String> strings; 

    public void Add(string value) { 
     strings.Add(value); 
    } 
} 

您可能还需要暴露strings为只读集合,否则你给人的印象是它可以直接操作(它不能)。

+3

圣***非常感谢 – Jason

相关问题