我有一段代码在 AppDomains 之间传递一个对象,为了使调试更容易,我想摆脱透明代理。
在编写此示例的过程中,我发现了如何做到这一点,但是我有两个非常相似的代码片段,它们的行为不同,我不知道为什么。
我知道实际值是正确的,所以这只是为了帮助调试。
在下面的例子中。我有一个 Data 类,它在默认域中初始化并传递给在另一个域中运行的 Process。如果我尝试使用静态方法克隆数据结构,它可以工作,但使用实例方法可以,我不太明白为什么。
谁能解释一下?
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;
}
}