我无法找到使用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?
答案 0 :(得分:3)
你看到的行为很正常。
如果您删除MarshalByRefObject
,因为您拥有Serializable
属性,则远程处理会为您序列化该类,并将状态封送到主AppDomain。因此,当该方法运行时,在当前AppDomain中运行,因为它位于主AppDOmain中(已被序列化并编组为当前AppDomain)。
如果你保留MarshalByRefObject
,远程控制将在远程对象上进行调用。
如果同时删除它们,它将引发异常,因为远程处理对象需要有一个异常。