.NET Remoting,为什么不是一个可远程列表?

Jas*_*son 4 .net c# remoting binaryformatter

我正在使用RemotingServices.MarshalActivator.GetObject在两台位于同一台计算机上的简单程序之间建立远程通道.

public class IpcInterface : MarshalByRefObject
{
    public int number = -1;
    public string text = "default";
    public List<String> strings;
}
// A simplification
Run Code Online (Sandbox Code Playgroud)

我已经确认通道存在并且可以进行通信,因为两个程序都成功更改number并且text完全唯一的值(已确认).

所以我立即尝试做同样的事情strings.

在一个节目中,我打电话给strings.Add("1").我试着阅读strings第二个程序的内容.它是空的.更重要的是,伯爵是0.我不知道为什么strings继续有0对象,好像我从来没有添加它们.同样的事情发生了Stack<T>Dictionary<T, K>,我只是不能将任何元素添加到它.为了确保通常没有引用奇怪的引用类型,我还尝试StringBuilder在IPC接口类中放置一个,并且在两个程序中成功维护"状态"以更改其值.

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

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

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

Bra*_*ith 9

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

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

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

    public void Add(string value) {
        strings.Add(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

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