.NET AppDomain путаница - PullRequest
       1

.NET AppDomain путаница

2 голосов
/ 18 ноября 2010

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

Что происходит в этомдело?Создается новый домен приложений?

1 Ответ

3 голосов
/ 18 ноября 2010

Поведение, которое вы видите, вполне нормально.

Если вы удалите MarshalByRefObject, так как у вас есть атрибут Serializable, удаленное взаимодействие сериализует класс для вас и направит состояние в основной домен приложения. Поэтому, когда метод запускается, он запускается в текущем домене приложений, поскольку он живет в основном домене приложений (был сериализован и перенаправлен в текущий домен приложений).

Если вы сохраните MarshalByRefObject, удаленное взаимодействие вызовет удаленный объект.

Если вы удалите оба, это вызовет исключение, так как удаленные объекты должны иметь одно.

...