5

私は、同じコンピューター上にある2つの単純なプログラム間にリモートチャネルを確立するためにを使用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")ました。strings2番目のプログラムの内容を読んでみました。でした。さらに、カウントはでした0。オブジェクトを追加しなかったかのように、なぜオブジェクトstringsが継続するのかわかりません。0同じことがaStack<T>Dictionary<T, K>、にも起こります。要素を追加することはできません。一般に参照型で何か奇妙なことが起こっていないことを確認するためStringBuilderに、IPCイン​​ターフェイスクラスにを入れてみました。その「状態」は、値を変更する両方のプログラムで正常に維持されました。

質問:文字列のリストが追加されないのはなぜですか、そして解決策は何ですか?

経験のある人がこの問題をすぐに見つけられることを願っています。同様の質問でグーグルを試しましたが、有用な結果は得られませんでした。驚いたことに、「. netremotingtransparentproxyのデバッグ」をグーグルで検索するための適切なリンクは1つしかありませんでした。それも私が持っている2番目の質問です。透過プロキシオブジェクトをデバッグするにはどうすればよいですか?

  1. すべてのオブジェクトは適切にインスタンス化されます(NullReferenceExceptionはありません。実際、例外はありません)。
4

1 に答える 1

9

問題はList<T>、それ自体がMarshalByRefObjectではなく、シリアル化可能なクラスであるということです。リストのメソッドを呼び出すときAdd()、実際に行っているのは、リモートオブジェクトにリストをシリアル化し、ローカルで逆シリアル化してから、ローカルオブジェクトのメソッドを呼び出すように要求することです。変更がリストオブジェクトのリモートインスタンスに伝播されることはありません。

IpcInterfaceリストを操作するには、クラスにメソッドを提供する必要があります。このタイプはから継承するためMarshalByRefObject、メソッドはローカルで逆シリアル化されたインスタンスではなく、リモートオブジェクトで呼び出されます。

すなわち

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

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

読み取り専用のコレクションとして公開することもstringsできます。そうしないと、直接操作できる(できない)という印象を与えることになります。

于 2012-11-21T05:00:20.450 に答える