.NET AppDomain混乱

时间:2010-11-18 09:53:06

标签: .net appdomain

我无法找到使用AppDomains时发生的事情的非常明确的描述,所以希望有人能够启发我。我有一个简单的测试程序(基本上扯掉了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 个答案:

答案 0 :(得分:3)

你看到的行为很正常。

如果您删除MarshalByRefObject,因为您拥有Serializable属性,则远程处理会为您序列化该类,并将状态封送到主AppDomain。因此,当该方法运行时,在当前AppDomain中运行,因为它位于主AppDOmain中(已被序列化并编组为当前AppDomain)。

如果你保留MarshalByRefObject,远程控制将在远程对象上进行调用。

如果同时删除它们,它将引发异常,因为远程处理对象需要有一个异常。