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 Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΡΠ½ΠΎ, ΡΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎ-ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π² Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅, Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.