1

我有一段代码在 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;
    }
}
4

1 回答 1

0

当您从另一个 appdomain 调用静态方法时,该方法会在该 appdomain 中调用,并在该 appdomainData中创建新对象。OTOH 调用实例方法时,调用被编组到对象的原始appdomain,因此在Data原始appdomain 中创建克隆对象。然后它作为透明代理被封送回另一个 appdomain 并作为 retern 值出现在那里。

于 2012-07-14T12:06:40.803 回答