5

我正在使用RemotingServices.MarshalandActivator.GetObject在驻留在同一台计算机上的两个简单程序之间建立远程处理通道。

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对象,就好像我从未添加过它们一样。同样的事情发生在 a Stack<T>andDictionary<T, K>上,我只是不能向它添加任何元素。为了确保引用类型一般不会发生什么奇怪的事情,我还尝试StringBuilder在 IPC 接口类中放置一个,并且在两个程序中成功地维护了“状态”,从而改变了它的值。

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

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

  1. 所有对象都被正确实例化(没有 NullReferenceException;事实上,没有异常)。
4

1 回答 1

9

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

你必须在你的IpcInterface类中提供方法来操作列表;因为此类型继承自MarshalByRefObject,所以将在远程对象而不是本地反序列化实例上调用方法。

IE

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

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

您可能还希望将其公开strings为只读集合,否则您给人的印象是它可以被直接操作(它不能)。

于 2012-11-21T05:00:20.450 回答