Что происходит со статическими данными в классе, если они доступны через домены приложения? - PullRequest
6 голосов
/ 31 октября 2011

У меня есть статический класс, который имеет некоторые статические данные.Что происходит с данными, если к ним обращаются из другого домена приложения?

  1. Будет ли копия статического класса для каждого домена?

  2. Будут ли скопированы примитивные типы?

  3. Что если данные сериализуются?

Ответы [ 5 ]

6 голосов
/ 31 октября 2011

Память между доменами приложений не используется. По умолчанию объекты являются глубоким клоном, если они MarshalByRef, то это похоже на удаленное взаимодействие, когда вызовы выполняются через AppDomain, поэтому кажется, что это общее состояние.

MarshalByRefObject - это базовый класс для объектов, которые обмениваются данными через границы домена приложения путем обмена сообщениями с использованием прокси. Объекты, которые не наследуются от MarshalByRefObject, неявно маршалируют по значению. Когда удаленное приложение ссылается на маршал по значению объекта, копия объекта передается через границы домена приложения.

Я не верю, что вы на самом деле можете вызывать статические члены, используя методы AppDomain, лучше всего было бы обернуть статические вызовы в классе экземпляра и использовать DoCallback для выполнения этого кода в другой домен и собирать состояние в объекте MarshalByRef.

См. Пример на MSDN

4 голосов
/ 31 октября 2011

Это сообщение довольно полно: http://blogs.msdn.com/b/cbrumme/archive/2003/06/01/51466.aspx

В нем говорится:

Независимо от того, являются ли типы независимыми от домена, каждый AppDomain должен получить свой собственная копия статических полей. И конструктор класса должен работать в каждом из этих доменов приложений, чтобы убедиться, что эти статические поля правильно инициализируется.

И я согласен.

2 голосов
/ 31 октября 2011

Вы должны сознательно загружать статический класс в каждый домен приложения, чтобы получить к нему доступ, для каждого домена приложения он будет поддерживать свои собственные статические данные.

check this : Статические поля в AppDomain

2 голосов
/ 31 октября 2011

Как правило, у вас будет копия данных и отдельная инициализация для каждого домена приложения.

  1. Да, для каждого домена приложения будет копия статического класса
  2. Нет.
  3. Не имеет значения.

Если это конкретный вопрос, вы можете поделиться примером того, что вы делаете.Существуют сценарии сортировки, которые будут копировать данные.

0 голосов
/ 06 ноября 2011

Простая программа, которая печатает 0,1,2 и 0,1,2, показывающая, что домен приложения не разделяет статические данные.

Только что изменено одно из: Статические поля в AppDomain

public static class Class1
{
    private static int Value = 0;
    public static void IncrementAndPrint()
    {
        Console.WriteLine(Value++);
    }
}

public class Foo : MarshalByRefObject
{
    public void Bar()
    {
        Class1.IncrementAndPrint();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var appDomain1 = System.AppDomain.CreateDomain("AppDomain1");
        var appDomain2 = System.AppDomain.CreateDomain("AppDomain2");    

        var class1InAppDomain1 = (Foo)appDomain1.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "ConsoleApplication1.Foo");
        var class1InAppDomain2 = (Foo)appDomain2.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "ConsoleApplication1.Foo");
        class1InAppDomain1.Bar();
        class1InAppDomain1.Bar();
        class1InAppDomain1.Bar();

        class1InAppDomain2.Bar();
        class1InAppDomain2.Bar();
        class1InAppDomain2.Bar();
    }
}
...