我正在使用RemotingServices.Marshal
和Activator.GetObject
在两台位于同一台计算机上的简单程序之间建立远程通道。
public class IpcInterface : MarshalByRefObject
{
public int number = -1;
public string text = "default";
public List<String> strings;
}
// A simplification
我已确认该频道存在且可以进行通信,因为两个节目都成功将number
和text
更改为完全唯一的值(已确认)。
所以我立即尝试为strings
做同样的事情。
在一个程序中,我打电话给strings.Add("1")
。我尝试在第二个程序中阅读strings
的内容。它是空的。更重要的是,计数是0
。我不知道为什么strings
继续拥有0
个对象,就像我从未添加过它们一样。同样的事情发生在Stack<T>
和Dictionary<T, K>
上,我无法添加任何元素。为了确保通常没有引用奇怪的引用类型,我还尝试在IPC接口类中放置StringBuilder
,并且在两个程序中成功维护“状态”以更改其值。 / p>
问题:为什么不添加字符串列表,解决方案是什么?
我希望有经验的人能马上发现这个问题。我尝试使用谷歌搜索类似的问题,但我没有得到任何有用的结果。令人惊讶的是,我只有一个很好的链接谷歌搜索“调试.net远程透明代理”。这也是我的第二个问题。如何调试透明代理对象?
答案 0 :(得分:9)
问题是List<T>
本身不是MarshalByRefObject
,而是一个可序列化的类。当您在列表上调用Add()
方法时,您实际要做的是要求远程对象序列化其列表,在本地对其进行反序列化,然后在本地对象上调用该方法。您的更改永远不会传播回列表对象的远程实例。
您必须在IpcInterface
类中提供操作列表的方法;因为此类型继承自MarshalByRefObject
,所以将在远程对象而不是本地反序列化的实例上调用这些方法。
即
public class IpcInterface : MarshalByRefObject {
public List<String> strings;
public void Add(string value) {
strings.Add(value);
}
}
您可能还希望将strings
公开为只读集合,否则您会给人的印象是它可以直接操作(它不能)。