Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Напоминаем, что один процесс может обслуживать множество доменов приложений.
Хотя необходимость создавать домены приложений вручную в коде действительно
возникает крайне редко (а то и почти никогда), все-таки возможность делать это
существует и заключается она в использовании статического метода CreateDomain(). Как не трудно догадаться, метод AppDomain.CreateDomain() имеет несколько перегруженных
версий. Как минимум, ему требуется указывать дружественное имя, которым должен
обладать новый домен приложения, как показано ниже:
static void Main(string [ ] args)
{
// Создание нового домена приложения в текущем процессе.
AppDomain anotherAD = AppDomain.CreateDomain("SecondAppDomain");
PrintAllAssembliesInAppDomain(anotherAD);
Console.ReadLine();
}
Если теперь запустить приложение (рис. 2), можно увидеть, что сборки System.
Windows.Forms.dll, System.Drawing.dll и System.dll будут загружаться только в
используемый по умолчанию домен приложения. Это может показаться нелогичным
для тех, кто привык иметь дело с традиционными приложениями Win32 (потому что по
идее оба домена приложений должны иметь доступ к одному и тому же набору сборок).
Напоминаем, однако, что каждая сборка загружается в домен приложения, а не прямо
в сам процесс.
Рис. 2. Один процесс с двумя доменами приложений
Далее важно обратить внимание на то, в домен приложения SecondAppDomain будет
автоматически помещаться своя собственная копия mscorlib.dll, поскольку эта
важная сборка автоматически загружается CLR-средой для каждого домена приложения.
Отсюда возникает вопрос: как тогда программно загружать сборку в домен
приложения? Очень просто: с помощью метода AppDomain.Load() (или, в качестве
альтернативного варианта, посредством метода AppDomain.executeAssembly(), позволяющего загружать и выполнять код метода Main() сборки *.ехе).
Например, если скопировать сборку CarLibrary.dll в каталог приложения AppDomainManipulator.exe, тогда можно загрузить ее в домен приложения
SecondAppDomain следующим образом:
static void Main(string[] args)
{
// Загрузка CarLibrary.dll в новый домен приложения.
AppDomain anotherAD = AppDomain.CreateDomain("SecondAppDomain");
try
{
anotherAD.Load("CarLibrary");
PrintAllAssembliesInAppDomain(anotherAD);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
Чтобы еще четче проиллюстрировать отношения между процессами, доменами
приложения и сборками, на рис. 3 приведена схема внутреннего устройства только что
созданного процесса AppDomainManipulator.exe.
Рис. 3. Внутреннее устройство процесса AppDomainManipulator.exe
На заметку! Во время отладки данного проекта (нажатием <F5>) в каждый домен приложения будет загружаться много дополнительных сборок, необходимых Visual Studio для выполнения процесса отладки. В случае просто запуска этого проекта (нажатием <Ctrl+F5>) будут отображаться только сборки, загружаемые конкретно в каждый домен приложения.
Дата публикования: 2015-07-22; Прочитано: 245 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!