Net framework 5, а также среды Visual Studio 2012 и C#



Download 6,27 Mb.
Pdf ko'rish
bet449/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   445   446   447   448   449   450   451   452   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C

рис. 22.1.
.Windows-процесс,.являющийся.хостом.для.CLR.
и.двух.доменов.приложений
Хотя отсутствие совместного использования памяти для хранения объектов или 
машинного кода выглядит расточительно, это оправдано, поскольку домены прило-
жений разрабатывались для изоляции; у CLR должна быть возможность выгрузить 
домен приложений и освободить все его ресурсы, никак не затронув остальные до-
мены. Дублирование структур данных CLR обеспечивает эту возможность. Кроме 
того, оно также гарантирует, что при использовании разными доменами одного типа 
статические поля будут задаваться отдельно для каждого домена.
Некоторые сборки предназначены для совместного использования разными до-
менами. Лучший пример — сборка 
MSCorLib dll
, созданная в Microsoft. Именно ей 
принадлежат типы 
System.Object

System.Int32
и другие типы, неотделимые от 
.NET Framework. Эта сборка автоматически загружается при инициализации CLR, 
и домены приложений совместно используют ее типы. Для экономии ресурсов 
MSCorLib dll
загружается как сборка, не связанная с конкретным доменом. Объ-
екты всех типов в этой куче загрузчика и весь машинный код методов этих типов 
совместно используются всеми доменами процесса. К сожалению, для достижения 
всех преимуществ от совместного использования ресурсов приходится кое-чем 
жертвовать: сборки, загруженные без привязки к доменам, нельзя выгружать до 
завершения процесса. Единственный способ вернуть ресурсы — завершить про-
цесс.


612
Глава.22 .Хостинг.CLR.и.домены.приложений
доступ к объектам из других доменов
Код, расположенный в одном домене приложений, способен взаимодействовать 
с типами и объектами другого домена. Однако доступ к этим типам и объектам 
возможен только через тщательно определенные механизмы. Приведенный далее 
пример демонстрирует процедуру создания домена приложений, загрузку в него 
сборки и конструирование определенного в этой сборке экземпляра типа. Код ил-
люстрирует различное поведение при конструировании типа, передаваемого путем 
продвижения по ссылке и по значению, а также типа, который вообще не использует 
механизм продвижения. Кроме того, демонстрируется, как объекты, переданные 
посредством разных вариантов продвижения, ведут себя при выгрузке создавшего 
их домена приложений. В этом примере мало кода, зато много комментариев. Затем 
следуют подробные объяснения, что именно делает CLR:
private static void Marshalling() {
// Получаем ссылку на домен, в котором исполняется вызывающий поток
AppDomain adCallingThreadDomain = Thread.GetDomain();
// Каждому домену присваивается значимое имя, облегчающее отладку
// Получаем имя домена и выводим его
String callingDomainName = adCallingThreadDomain.FriendlyName;
Console.WriteLine(
"Default AppDomain's friendly name={0}", callingDomainName);
// Получаем и выводим сборку в домене, содержащем метод Main.
String exeAssembly = Assembly.GetEntryAssembly().FullName;
Console.WriteLine("Main assembly={0}", exeAssembly);
// Определяем локальную переменную, ссылающуюся на домен
AppDomain ad2 = null;
// ПРИМЕР 1. Доступ к объектам другого домена приложений
// с продвижением по ссылке
Console.WriteLine("{0}Demo #1", Environment.NewLine);
// Создаем новый домен (с теми же параметрами защиты и конфигурирования)
ad2 = AppDomain.CreateDomain("AD #2", null, null);
MarshalByRefType mbrt = null;
// Загружаем нашу сборку в новый домен, конструируем объект
// и продвигаем его обратно в наш домен
// (в действительности мы получаем ссылку на представитель)
mbrt = (MarshalByRefType)
ad2.CreateInstanceAndUnwrap(exeAssembly, "MarshalByRefType");
Console.WriteLine("Type={0}", mbrt.GetType()); // CLR неверно 
// определяет тип
// Убеждаемся, что получили ссылку на объект-представитель
Console.WriteLine(


613
Домены.приложений
"Is proxy={0}", RemotingServices.IsTransparentProxy(mbrt));
// Все выглядит так, как будто мы вызываем метод экземпляра 
// MarshalByRefType, но на самом деле мы вызываем метод типа 
// представителя. Именно представитель переносит поток в тот домен, 
// в котором находится объект, и вызывает метод для реального объекта
mbrt.SomeMethod();
// Выгружаем новый домен
AppDomain.Unload(ad2);
// mbrt ссылается на правильный объект-представитель;
// объект-представитель ссылается на неправильный домен
try {
// Вызываем метод, определенный в типе представителя
// Поскольку домен приложений неправильный, появляется исключение
mbrt.SomeMethod();
Console.WriteLine("Successful call.");
}
catch (AppDomainUnloadedException) {
Console.WriteLine("Failed call.");
}
// ПРИМЕР 2. Доступ к объектам другого домена
// с продвижением по значению
Console.WriteLine("{0}Demo #2", Environment.NewLine);
// Создаем новый домен (с такими же параметрами защиты 
// и конфигурирования, как в текущем)
ad2 = AppDomain.CreateDomain("AD #2", null, null);
// Загружаем нашу сборку в новый домен, конструируем объект
// и продвигаем его обратно в наш домен
// (в действительности мы получаем ссылку на представитель)
mbrt = (MarshalByRefType)
ad2.CreateInstanceAndUnwrap(exeAssembly, "MarshalByRefType");
// Метод возвращает КОПИЮ возвращенного объекта;
// продвижение объекта происходило по значению, а не по ссылке
MarshalByValType mbvt = mbrt.MethodWithReturn();
// Убеждаемся, что мы НЕ получили ссылку на объект-представитель
Console.WriteLine(
"Is proxy={0}", RemotingServices.IsTransparentProxy(mbvt));
// Кажется, что мы вызываем метод экземпляра MarshalByRefType,
// и это на самом деле так
Console.WriteLine("Returned object created " + mbvt.ToString());
// Выгружаем новый домен
AppDomain.Unload(ad2);
// mbrt ссылается на действительный объект;
продолжение



614
Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   445   446   447   448   449   450   451   452   ...   658




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish