Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 11:

Процессы, домены, потоки в C#

Загрузка объектов приложения в домены

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

using System;
using System.Runtime.Remoting;  // Для меж_доменного взаимодействия
    
namespace Test
{
    // Объект для размещения в пользовательском домене
    class SecondClass : MarshalByRefObject
    {
        // Поле для хранения текста сообщения
        private string message;
    
        // Конструктор заполняет поле именем текущего домена
        public SecondClass()
        {
            // Читаем имя текущего домена
            message = AppDomain.CurrentDomain.FriendlyName;
        }
    
        // Сервис доступа к полю 
        public String Message
        {
            get { return message; }
        }
    }
    
    // Весь последующий код будет размещен в основном домене
    class BaseClass
    {
        int i = 0;  // Счетчик сообщений печати
    
        // Конструктор
        public BaseClass()
        {
            // Выводим имя основного домена
            Console.WriteLine("{1}) Имя основного домена: 
		{0}", AppDomain.CurrentDomain.FriendlyName, ++i);
    
            // Создаем именованный пользовательский домен
            AppDomain userDomain = AppDomain.
                CreateDomain("Пользовательский домен");
    
            // Получим имя текущей сборки и полное имя 
	    //  типа "Test.UserDomain"
            string assemblyName = System.Reflection.Assembly.
                GetAssembly(typeof(BaseClass)).GetName().Name;
            string typeName = typeof(SecondClass).FullName;
    
            // Создаем удаленный объект типа "Test.UserDomain",
            // находящийся в текущей сборке 
            ObjectHandle objHandle = userDomain.CreateInstance
		(assemblyName, typeName);
    
            // Получаем ссылку для работы с удаленным объектом
            SecondClass obj = (SecondClass)objHandle.Unwrap();
    
            // Проверяем, действительно ли установлен 
	    //  канал связи Transparent Proxy
            if (RemotingServices.IsTransparentProxy(obj))
            {
                Console.WriteLine("{0}) Канал связи с 
			удаленным объектом установлен!", ++i);
                Console.WriteLine("{1}) Имя пользовательского
			домена:\n\t'{0}'", obj.Message, ++i);
            }
            else
                Console.WriteLine("{0}) Нет связи с 
			другим доменом", ++i);
        }
    }
    
    // Запуск - тоже в основном домене
    class Program
    {
        static void Main()
        {
            // Настройка консоли
            Console.Title = "Механизм взаимодействия 
		доменов приложения";
    
            Console.ForegroundColor = ConsoleColor.White;
            Console.CursorVisible = false;
            Console.WindowWidth = 48;
            Console.WindowHeight = 5;
    
            new BaseClass();// Исполняем
    
            Console.ReadLine();
        }
    }
}
Листинг 11.1 . Механизм взаимодействия доменов приложения

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

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

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974