我有一段代码,它通过AppDomains传递一个对象,为了使调试更容易,我想去掉TransparentProxy。
在写这个示例的过程中,我发现了如何做到这一点,但我有两个非常相似的代码片段,它们的行为不同,我不确定为什么。
我知道实际值是正确的,所以这只是为了帮助调试。
在下面的示例中。我有一个类数据,它在默认域中初始化,并传递给在另一个域中运行的进程。如果我尝试使用static方法克隆数据结构,它可以工作,但是使用instance方法可以,我不太明白为什么。
有谁能解释一下吗?
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;
}
}发布于 2012-07-14 20:06:41
当您从另一个应用程序域调用静态方法时,将在该应用程序域中调用该方法,并在该应用程序域中创建新的Data对象。当您调用实例方法时,调用被编组到对象的原始应用程序域,因此克隆Data对象将在原始应用程序域中创建。然后,它作为透明代理被封送回另一个appdomain,并在那里显示为retern值。
https://stackoverflow.com/questions/11483540
复制相似问题