2012-07-14 23 views
1

我有一段代碼正在跨AppDomains傳遞一個對象並使調試更容易我想擺脫TransparentProxy。在編寫這個示例的過程中,我發現瞭如何去做,但是我有兩個非常相似的代碼片斷,它們的行爲有所不同,我不確定爲什麼。使用AppDomain時對TransparentProxy的查詢

我知道實際值是正確的,所以這只是爲了幫助調試。

在下面的例子中。我有一個類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; 
    } 
} 

回答

0

當你調用從其他應用程序域的靜態方法,該方法在應用程序域調用,並在AppDomain中創建的新Data對象。 OTOH當你調用實例方法時,調用被封送到對象的原始appdomain,所以在原始appdomain中創建克隆Data對象。然後將其作爲透明代理封送回另一個應用程序域,並作爲retern值出現在那裏。

+0

這是有道理的。謝謝 – sgmoore 2012-07-14 13:05:44