代码之家  ›  专栏  ›  技术社区  ›  Graham Clark

.NET AppDomain混淆

  •  2
  • Graham Clark  · 技术社区  · 14 年前

    在使用AppDomain时,我还没有找到一个非常清楚的描述,所以希望有人能够启发我。我有一个简单的测试程序 MSDN example ):

    using System;
    using System.Reflection;
    
    class Program
    {
       public static void Main(string[] args)
       {            
          A localA = new A() { Name = "local" };
          localA.PrintAppDomain();
    
          AppDomain domain = AppDomain.CreateDomain("NewDomain");
          A remoteA = (A)domain.CreateInstanceAndUnwrap(
              Assembly.GetExecutingAssembly().FullName, "A");
          remoteA.Name = "remote";
          remoteA.PrintAppDomain();
    
          remoteA.PrintA(localA);
          remoteA.PrintAppDomain();
       }
    }
    
    [Serializable]
    public class A : MarshalByRefObject
    {
       public string Name { get; set; }
    
       public void PrintAppDomain()
       {
          Console.WriteLine("In AppDomain {1}", 
              this.Name, AppDomain.CurrentDomain.FriendlyName);
       }
    
       public void PrintA(A a)
       {
          Console.WriteLine(a.ToString());
       }
    
       public override string ToString()
       {
          return String.Format("A : {0}", this.Name);
       }
    }
    

    跑步时,打印出来

    在appdomain test.exe中
    在AppDomain NewDomain中
    答:本地
    在AppDomain NewDomain中

    所以…当我这样做的时候 remote.PrintA(localA) ,这是否涉及编组?查看Reflector中的IL并不意味着这一点,但我认为一个AppDomain中的数据无法访问另一个AppDomain中的数据。

    如果我删除 : MarshalByRefObject 从声明 A ,程序打印

    在appdomain test.exe中
    在appdomain test.exe中
    答:本地
    在appdomain test.exe中

    在这种情况下发生了什么?是否正在创建新的AppDomain?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Aliostad    14 年前

    MarshalByRefObject Serializable