Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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