Мне не удалось найти очень четкое описание того, что происходит при использовании доменов приложений, поэтому, надеюсь, кто-то сможет просветить меня.У меня есть простая тестовая программа (в основном сорванный с 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: local
В AppDomain test.exe
Что происходит в этомдело?Создается новый домен приложений?