Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π—Π«Πš ΠŸΠ ΠžΠ“Π ΠΠœΠœΠ˜Π ΠžΠ’ΠΠΠ˜Π― Π‘# 2005 И ΠŸΠ›ΠΠ’Π€ΠžΠ ΠœΠ .NET 2.0. 3-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 118

Автор Π­Π½Π΄Ρ€ΡŽ ВроСлсСн

public static void PrintAllAssembliesInAppDomain(ApsDomain ad) {

 Assembly[] loadedAssemblies = ad.GetAssemblies();

 Console.WriteLine("*** ΠšΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… {0} ***\n", ad.FriendlyName);

 foreach (Assembly a in loadedAssemblies) {

  Console.WriteLine("-β€Ί Имя: {0}", a.GetName().Name);

  Console.WriteLine("-β€Ί ВСрсия: {0}\n", a.GetName().Version);

 }

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ Main(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ PrintAllAssembliesInAppDomain() ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ссылку Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π΄ΠΎΠΌΠ΅Π½ прилоТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свойство AppDomain.CurrentDomain.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ интСрСсным, ΠΌΠ΅Ρ‚ΠΎΠ΄ Main() ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ сообщСния Windows Forms (для этого срСда CLR Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ System.Windows.Forms.dll, System.Drawing.dll ΠΈ System.dll, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ссылки Π½Π° эти ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ ΠΈ соотвСтствСнно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² using).

static void Main(string[] args) {

 Console.WriteLine("***** ЧудСсноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ AppDomain *****\n");

 // Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ AppDomain.

 AppDomain defaultAD= AppDomain.CurrentDomain;

 MessageBox.Show(''ΠŸΡ€ΠΈΠ²Π΅Ρ‚");

 PrintAllAssembliesInAppDomain(defaultAD);

 Console.ReadLine();

}

На рис. 13.6 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄ (Π½ΠΎΠΌΠ΅Ρ€Π° вСрсий Ρƒ вас ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ).

Рис. 13.6. ΠŸΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ созданиС Π½ΠΎΠ²Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² прилоТСния

Напомним, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ мноТСство Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² прилоТСния, И хотя Π²Π°ΠΌ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ вряд Π»ΠΈ понадобится Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΎΠΌΠ΅Π½Ρ‹ прилоТСния, Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° CreateDomain(). НСтрудно Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ AppDomain.CreateDomain() ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½. Π’Ρ‹, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ понятноС имя Π½ΠΎΠ²ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

static void Main(string[] args) {

 β€¦

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ AppDomain Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ процСсса.

 AppDomain anotherAD = AppDomain.CreateDomain("SecondAppDomain");

 PrintAllAssembliesInAppDomain(anotherAD);

 Console.ReadLine();

}

Если Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ (рис. 13.7), Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ System.Windows.Forms.dll, System.Drawing.dll ΠΈ System.dll Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния, созданного ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ для Ρ‚Π΅Ρ…. ΠΊΡ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ ΠΎΠΏΡ‹Ρ‚ программирования с использованиСм Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² Win32 (скорСС, ΠΎΠ±Π° Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ мноТСству ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ²). Напомним, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎ Ρ‚ΠΎΠΌ. Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ загруТаСтся Π² Ρ€Π°ΠΌΠΊΠΈ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния Π° Π½Π΅ Π² Ρ€Π°ΠΌΠΊΠΈ нСпосрСдствСнно самого процСсса.

Рис. 13.7. Один процСсс с двумя Π΄ΠΎΠΌΠ΅Π½Π°ΠΌΠΈ прилоТСния

Π”Π°Π»Π΅Π΅, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΌΠ΅Π½ прилоТСния SecondAppDomain автоматичСски ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ копию mscorlib.dll, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ автоматичСски загруТаСтся срСдой CLR для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния. Π­Ρ‚ΠΎ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ вопрос "Как ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π² Π΄ΠΎΠΌΠ΅Π½ прилоТСния?" ΠžΡ‚Π²Π΅Ρ‚: с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° АррDomain.Load() (ΠΈΠ»ΠΈ, Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ AppDomain.executeAssembly()). Π’ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ скопировали CarLibrary.dll Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ прилоТСния AppDomainManipulator.exe, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ CarLibrary.dll Π² Π΄ΠΎΠΌΠ΅Π½ прилоТСния SecondAppDomain Ρ‚Π°ΠΊ.

static void Main(string[] args) {

 Console.WriteLine("***** ЧудСсноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ AppDomain *****\n");

 β€¦

 // Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° CarLibrary.dll Π² Π½ΠΎΠ²Ρ‹ΠΉ AppDomain.

 AppDomain anotherAD = AppDomain.CreateDomain("SecondAppDomain");

 anotherAD.Load("CarLibrary");

 PrintAllAssembliesInAppDomain(anotherAD);

 Console.ReadLine();

}

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ взаимосвязСй ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами, Π΄ΠΎΠΌΠ΅Π½Π°ΠΌΠΈ прилоТСния ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ, рассмотритС рис. 13.8, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ прСдставлСна Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ устройства Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ построСнного процСсса AppDomainManipulator.exe.

Рис. 13.8. Π‘Ρ…Π΅ΠΌΠ° функционирования процСсса AppDomainManipulator.exe

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Π°Ρ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² прилоТСния

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ срСда CLR Π½Π΅ позволяСт Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ .NET. Однако, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ AppDomain.Unload(), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΄ΠΎΠΌΠ΅Π½ прилоТСния ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅Π³ΠΎ процСсса. ΠŸΡ€ΠΈ этом Π΄ΠΎΠΌΠ΅Π½ прилоТСния Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

Напомним, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ AppDomain опрСдСляСт Π½Π°Π±ΠΎΡ€ событий, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся DomainUnload. Π­Ρ‚ΠΎ событиС гСнСрируСтся Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΠΌΠ΅Π½ прилоТСния (Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ, созданным ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) выгруТаСтся ΠΈΠ· содСрТащСго этот Π΄ΠΎΠΌΠ΅Π½ процСсса. Π”Ρ€ΡƒΠ³ΠΈΠΌ Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ внимания событиСм являСтся событиС ProcessExit, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ гСнСрируСтся ΠΏΡ€ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΈΠ· процСсса Π΄ΠΎΠΌΠ΅Π½Π°, создаваСмого ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ρ‡Ρ‚ΠΎ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ всСго процСсса). Π’Π°ΠΊ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ anotherAD ΠΈΠ· процСсса AppDomainManipulator.exe ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·Π²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠΌΠ΅Π½ прилоТСния Π·Π°ΠΊΡ€Ρ‹Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ событий.

static void Main(string[] args) {

 β€¦

 // ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΡŽ DomainUnload.

 anotherAD.DomainUnload += new EventHandler(anotherAD_DomainUnload);

 // Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° anotherAD.

AppDomain.Unload(anotherAD);

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ событиС DomainUnload Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΏΠ°Ρ€Π΅ с Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠΌ System.EventHandler, поэтому Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ anotherAD_DomainUnload() Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

public static void anotherAD_DomainUnload(object sender, EventArgs e) {

 Console.WriteLine("***** Π’Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° anotherAD! *****\n");

}

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·Π²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния, созданного ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Main() Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ событиС ProcessEvent, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π΄ΠΎΠΌΠ΅Π½Ρƒ прилоТСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

static void Main(string [] args) {

 β€¦

 AppDomain defaultAD = AppDomain.CurrentDomain;

 defaultAD.ProcessExit +=new EventHandler(defaultAD_ProcessExit);

}

ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ подходящий ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий.

private static void defaultAD_ProcessExit (object sender, EventArgs e) {

 Console.WriteLine("***** Π’Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° defaultAD! *****\n");

}

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ AppDomainManipulator Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Π³Π»Π°Π²Π΅ 13.

Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ контСкста ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΌΠ΅Π½Ρ‹ прилоТСния – это логичСскиС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… процСсса, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² .NET. Π”ΠΎΠΌΠ΅Π½ прилоТСния, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»ΠΈΡ‚ΡŒ дальшС Π½Π° контСкстныС области со своими Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌΠΈ. Π’ сущности, контСкст .NET обСспСчиваСт Π΄ΠΎΠΌΠ΅Π½Ρƒ прилоТСния Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ "ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ" для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ контСкст, срСда CLR ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π΄Π²ΠΈΠ³Π°ΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ трСбования Π² срСдС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·Π°ΠΌ ΠΈ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для этого срСда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΡ… Π³Ρ€Π°Π½ΠΈΡ†Ρƒ контСкста. Π‘Π»ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° позволяСт срСдС CLR ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² соотвСтствии с контСкстно-зависимыми установками Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. НапримСр, Ссли Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ класса C#, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΉ автоматичСской ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ мноТСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [Synchronization]), Ρ‚ΠΎ срСда CLR ΠΏΡ€ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ создаст "синхронизированный контСкст".

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ процСсс опрСдСляСт создаваСмый ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΎΠΌΠ΅Π½ прилоТСния, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½ прилоТСния ΠΈΠΌΠ΅Π΅Ρ‚ создаваСмый ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ контСкст. Π­Ρ‚ΠΎΡ‚ создаваСмый ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ контСкст (Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ Π½Π° контСкст 0, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ всСгда оказываСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ контСкстом, создаваСмым Π² Π΄ΠΎΠΌΠ΅Π½Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ) примСняСтся для Ρ‚Π΅Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² .NET, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… особых ΠΈΠ»ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… контСкстных Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ. Π’Ρ‹ Π²ΠΏΡ€Π°Π²Π΅ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² .NET Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π² контСкст 0. Когда срСда CLR опрСдСляСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ трСбования, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ контСкста Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния. На рис. 13.9 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° схСма взаимодСйствия процСсса, Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² прилоТСния ΠΈ контСкстов.

Рис. 13.9. ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹, Π΄ΠΎΠΌΠ΅Π½Ρ‹ прилоТСния ΠΈ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ контСкста

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎ-нСзависимыС ΠΈ контСкстно-связанныС Ρ‚ΠΈΠΏΡ‹

Π’ΠΈΠΏΡ‹ .NET ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΡ€Π΅Π΄ΡŠΡΠ²Π»ΡΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… контСкстных Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ контСкстно-нСзависимыми ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π­Ρ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ доступны ΠΈΠ· любого мСста Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния, Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ… Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ особых Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ срСдС выполнСния. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ контСкстно-нСзависимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… усилий, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ приходится (Π² частности, Π½Π΅ трСбуСтся Π½Π°Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ контСкстными Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса System.ContextBoundObject).

// ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎ-нСзависимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ загруТаСтся Π² контСкст 0.

public class SportsCar()

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ контСкстного размСщСния, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ контСкстно-связанными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса System.ContextBoundObject. Π­Ρ‚ΠΎΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс закрСпляСт Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ смоТСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Π±Ρ‹Π» создан. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ€ΠΎΠ»ΠΈ контСкста .NET Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ясно, Ρ‡Ρ‚ΠΎ Π² случаС, ΠΊΠΎΠ³Π΄Π° контСкстно-связанный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ оказываСтся Π² Π½Π΅ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ контСкстС, Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.