Не успях да намеря много ясно описание на това, което се случва при използване на AppDomains, така че се надявам, че някой ще може да ме просветли. Имам проста тестова програма (в общи линии изтръгната от примера за MSDN):
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
A : local
В AppDomain NewDomain
И така... когато направя remote.PrintA(localA)
, това включва ли маршалинг? Разглеждането на IL в Reflector предполага, че не, но си помислих, че данните в един AppDomain нямат достъп до данни от друг AppDomain.
Ако премахна : MarshalByRefObject
от декларацията на A
, програмата отпечатва
В AppDomain test.exe
В AppDomain test.exe
A : локален
В AppDomain test.exe
Какво се случва в този случай? Създава ли се нов AppDomain?