1

AppDomain 間でオブジェクトを渡すコードのセクションがあり、デバッグを容易にするために、TransparentProxy を削除したいと考えています。

このサンプルを書いている過程で、その方法を発見しましたが、動作が異なる 2 つの非常によく似たコード スニペットがあり、その理由はわかりません。

実際の値が正しいことはわかっているので、これはデバッグを支援するためのものです。

以下の例では。デフォルトドメインで初期化され、別のドメインで実行されている Process に渡されるクラス Data があります。静的メソッドを使用してデータ構造を複製しようとすると機能しますが、インスタンス メソッドを使用すると機能し、その理由がよくわかりません。

誰でも説明できますか?

using System;

class Program
{
    static void Main(string[] args)
    {
        AppDomain otherDomain = AppDomain.CreateDomain("Test");

        var otherType = typeof(Process);
        var process = otherDomain.CreateInstanceAndUnwrap(
                 otherType.Assembly.FullName, otherType.FullName) as Process;

        Data d = new Data() { Info = "Hello" };
        process.SetData(d);
    }
}

public class Process : MarshalByRefObject
{

    public void SetData(Data data)
    {
        Data data1 = Data.Clone(data);
        Data data2 = data.Clone();

        Console.WriteLine(data1.Info); 
           // Debugger shows data1.Info as Hello

        Console.WriteLine(data2.Info); 
           // Outputs Hello, but Debugger shows data2 as     
           // System.Runtime.Remoting.Proxies.__TransparentProxy
    }

}

public class Data : MarshalByRefObject
{
    public string Info { get; set; }

    public Data Clone()
    {
        return Data.Clone(this);
    }

    public static Data Clone(Data old)
    {
        var clone = new Data();
        clone.Info = old.Info;
        return clone;
    }
}
4

1 に答える 1

0

他のアプリドメインから静的メソッドを呼び出すと、そのアプリドメインでメソッドが呼び出され、そのアプリドメインに新しいDataオブジェクトが作成されます。OTOH インスタンス メソッドを呼び出すと、呼び出しはオブジェクトの元の appdomain にマーシャリングされるため、クローンDataオブジェクトは元の appdomain に作成されます。次に、トランスペアレント プロキシとして他の appdomain にマーシャリングされ、retern 値として表示されます。

于 2012-07-14T12:06:40.803 に答える