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;
}
}