управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ управляСмый ΠΊΠΎΠ΄

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с запуском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ C/C++, которая Ρ‚Π°ΠΊΠΆΠ΅ называСтся «Π½Π΅ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ». Π’ ΠΌΠΈΡ€Π΅ нСуправляСмого ΠΊΠΎΠ΄Π° практичСски Π·Π° всС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист. Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опСрационная систСма (ОБ) Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ запускаСт. Π—Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΎΡ‚ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктов бСзопасности β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист.

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

ПослС создания IL ΠΈΠ· ΠΊΠΎΠ΄Π° высокого уровня Π²Ρ‹, скорСС всСго, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ срСда CLR Π±Π΅Ρ€Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° сСбя ΠΈ запускаСт процСсс JIT-компиляции, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ JIT для прСобразования ΠΊΠΎΠ΄Π° ΠΈΠ· ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ языка Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° ЦП. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, срСдС CLR Ρ‚ΠΎΡ‡Π½ΠΎ извСстно, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄, поэтому ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ эффСктивно ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌ.

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ языком CIL ΠΈΠ»ΠΈ MSIL.

ВзаимодСйствиС нСуправляСмого ΠΊΠΎΠ΄Π°

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, срСда CLR позволяСт ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ управляСмым ΠΈ нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ, ΠΈ Π΄Π°ΠΆΠ΅ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов объСм ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° довольно Π²Π΅Π»ΠΈΠΊ. Π­Ρ‚ΠΎ называСтся взаимодСйствиСм ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ взаимодСйствиСм. ВсС это позволяСт Π²Π°ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π΅. Но слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ пСрСсСкаСт Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ срСды выполнСния, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ снова осущСствляСтся Π² Π²ΠΈΠ΄Π΅ нСуправляСмого ΠΊΠΎΠ΄Π° с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ограничСниями.

Аналогично, C# β€” это язык, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСуправляСмыС конструкции, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, прямо Π² ΠΊΠΎΠ΄Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ нСбСзопасного контСкста, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ управляСтся срСдой CLR.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ВзаимодСйствиС управляСмого ΠΈ нСуправляСмого ΠΊΠΎΠ΄Π°


Автор: Π‘Π΅Ρ€Π³Π΅ΠΉ ВСпляков
ООО НПП ΠšΡ€ΠΎΠ½ΠΎΡ
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: RSDN Magazine #3-2008

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ: 12.02.2009
Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ: 10.12.2016
ВСрсия тСкста: 1.0

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΎΠΏΠΈΡˆΡƒ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ обращСния ΠΈΠ· нСуправляСмого ΠΊΠΎΠ΄Π° ΠΊ управляСмому, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с распространСнной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ log4net.

1 ΠžΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹

РСализация ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Ρ‚.Π΅. содСрТащих управляСмый ΠΈ нСуправляСмый ΠΊΠΎΠ΄) основана Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ срСда CLR ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ конструкции, Π½Π΅ входящиС Π² ΠΎΠ±Ρ‰ΡƒΡŽ систСму Ρ‚ΠΈΠΏΠΎΠ² CLR, ΠΏΡƒΡ‚Π΅ΠΌ указания Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΈΠΏ являСтся Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ (opaque type). ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅ содСрТат Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΈΠΏΠ΅, вмСсто этого хранится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ экзСмпляра Π² памяти.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ срСда CLR Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ полях Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со ссылками Π½Π° управляСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ компиляции этого ΠΊΠΎΠ΄Π° Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ сообщСниС ΠΎΠ± ошибкС: β€œerror C3265: cannot declare a managed ‘managed_’ in an unmanaged OpaqueObject”. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ управляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ располагаСтся Π² управляСмой ΠΊΡƒΡ‡Π΅, ΠΈ сборщик мусора Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π³Π΄Π΅-Ρ‚ΠΎ Π² нСуправляСмой памяти ΠΎΡΡ‚Π°Π»Π°ΡΡŒ ссылка Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Если Π±Ρ‹ компиляция ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΠΊΠΎΠ΄Π° Π±Ρ‹Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹, Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (послС сборки мусора) Π² нСуправляСмой памяти остался Π±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. А Π²Ρ‹ вСдь Π·Π½Π°Π΅Ρ‚Π΅, ΠΊ Ρ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π½ΠΈΠ΅ указатСля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚?

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ срСда CLR прСдоставляСт Ρ‚ΠΈΠΏ System::Runtime::InteropServices::GCHandle, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ со ссылками Π½Π° управляСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· нСуправляСмой памяти. Для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра GCHandle примСняСтся статичСская функция GCHandle::Alloc. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создаСтся новая ссылка Π½Π° управляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈ дСскриптор ссылки сохраняСтся Π² экзСмплярС Ρ‚ΠΈΠΏΠ° GCHandle. Π’ΠΈΠΏ GCHandle ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ Ρ‚ΠΈΠΏΠΎΠ² ссылок Π½Π° управляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ слабыС (weak references) ΠΈ зафиксированныС (pinned references) ссылки. Π›ΡŽΠ±Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ GCHandle Π² IntPtr (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ бСзопасно Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅) ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. ЭкзСмпляр Ρ‚ΠΈΠΏΠ° GCHandle (ΠΈ ссылка Π½Π° управляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚) ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ явно Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ GCHandle.Free.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Π‘++-класс дСмонстрируСт использованиС Ρ‚ΠΈΠΏΠ° GCHandle для взаимодСйствия управляСмого ΠΈ нСуправляСмого ΠΊΠΎΠ΄Π°.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ управляСмому ΠΊΠΎΠ΄Ρƒ ΠΈΠ· нСуправляСмого Π½Π΅ Ρ‚Π°ΠΊ ΠΈ слоТно. Но для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот доступ Π±Ρ‹Π» Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΏΡ€ΠΈ компиляции прилоТСния Π±Π΅Π· ΠΊΠ»ΡŽΡ‡Π° /clr, придСтся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚Ρ€ΡƒΠ΄ΠΈΡ‚ΡŒΡΡ.

2 Доступ ΠΊ управляСмому ΠΊΠΎΠ΄Ρƒ ΠΈΠ· нСуправляСмого

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ описаны основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ взаимодСйствия управляСмого ΠΈ нСуправляСмого ΠΊΠΎΠ΄Π°. Но всС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ компилятора /clr, Π½ΠΎ ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ, Ссли это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ? Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли имССтся консольноС Win32-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, слуТба ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ с использованиСм MFC, Π½ΠΎ Π½Π΅Ρ‚ возмоТности ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ /clr?

управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. Figure1. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄-Figure1. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Figure1. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с запуском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ C/C++, которая Ρ‚Π°ΠΊΠΆΠ΅ называСтся "нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ". Π’ ΠΌΠΈΡ€Π΅ нСуправляСмого ΠΊΠΎΠ΄Π° практичСски Π·Π° всС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист. Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опСрационная систСма (ОБ) Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ запускаСт. Π—Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΎΡ‚ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктов бСзопасности β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист.
Рисунок 1. ВзаимодСйствиС управляСмого ΠΈ нСуправляСмого ΠΊΠΎΠ΄Π°.

Для Π½Π°Ρ‡Π°Π»Π° рассмотрим Π½Π°Π±ΠΎΡ€ управляСмых классов, написанных Π½Π° языкС C#.

Π­Ρ‚ΠΎΡ‚ класс Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚, это всСго лишь ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ взаимодСйствиС управляСмого ΠΈ нСуправляСмого ΠΊΠΎΠ΄Π°.

Класс Class2 Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ слишком слоТСн, Π½ΠΎ ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ управляСмый класс Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° конструктора.

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ компилируСтся ΠΈ прСкрасно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ для Π΅Π³ΠΎ компиляции Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ /clr, поэтому ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Π² нСуправляСмом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ gcroot являСтся Ρ‚ΠΎΠ½ΠΊΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ Π½Π°Π΄ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΈ СдинствСнным Ρ‡Π»Π΅Π½ΠΎΠΌ этого класса являСтся intptr_t. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ экзСмпляр класса gcroot ΠΈ intptr_t Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ прСдставлСниС Π² памяти.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ управляСмых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΡ… компиляции константа _MANAGED ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΈ Ρ€Π°Π²Π½Π° 1.

ΠŸΡ€ΠΈ всСм этом класс ManagedObject Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Но ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π΅Ρ‰Π΅ Ρ€Π΅ΡˆΠ΅Π½Π° Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ· нСуправляСмого ΠΊΠΎΠ΄Π° создаСт экзСмпляр класса ManagedObject, компилятор автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ конструктора копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Но ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ intptr_t ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° gcroot Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ дСскриптор управляСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ экзСмпляра gcroot Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв выраТаСтся Π² Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΈ доступа ΠΊ памяти.

РСшСниС Π·Π°Π΄Π°Ρ‡ΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ экспортируСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ конструктора копирования ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ cpp-Ρ„Π°ΠΉΠ»Π΅.

Π’ΠΎΠ³Π΄Π°, Ссли Π² нСуправляСмом ΠΊΠΎΠ΄Π΅ встрСтится Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°:

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса ManagedWrapper Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ управляСмого класса Π½Π΅ составит Ρ‚Ρ€ΡƒΠ΄Π°. Но Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ нСсколько макросов, ΡƒΡΠΊΠΎΡ€ΡΡŽΡ‰ΠΈΡ… этот процСсс.

ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ класса-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ управляСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ макроса DECLARE_WRAPPER рСализация ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Π½Π°Π΄ Class1 становится Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ.

НСнамного слоТнСС ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° для класса Class2.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ классы ΠΎΠ±ΠΎΠ»ΠΎΡ‡Π΅ΠΊ достаточно просто.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния этого ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (рисунок 2).

управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. Figure2. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄-Figure2. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Figure2. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с запуском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ C/C++, которая Ρ‚Π°ΠΊΠΆΠ΅ называСтся "нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ". Π’ ΠΌΠΈΡ€Π΅ нСуправляСмого ΠΊΠΎΠ΄Π° практичСски Π·Π° всС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист. Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опСрационная систСма (ОБ) Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ запускаСт. Π—Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΎΡ‚ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктов бСзопасности β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист.
Рисунок 2. Π Π°Π±ΠΎΡ‚Π° с классами-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈΠ· нСуправляСмого ΠΊΠΎΠ΄Π°.

Π’ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ я столкнулся с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ dll-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΈΠ· нСуправляСмого прилоТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ DebuggerType Π² Mixed. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Auto) опрСдСляСт Ρ‚ΠΈΠΏ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ΠΏΠΎ EXE-Ρ„Π°ΠΉΠ»Ρƒ, поэтому ΠΏΡ€ΠΈ запускС нСуправляСмого EXE-Ρ„Π°ΠΉΠ»Π° IDE запускаСт нСуправляСмый ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, ΠΈ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ управляСмый ΠΊΠΎΠ΄ нСльзя. А ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Mixed, IDE Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΎΠ±Π° ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°, ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ управляСмых ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚.

3 ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

ΠŸΡ€ΠΈ создании ΠΎΠ±ΠΎΠ»ΠΎΡ‡Π΅ΠΊ Π½Π°Π΄ классами Class1 ΠΈ Class2 Π½Π΅ Π±Ρ‹Π»Π° ΡƒΡ‡Ρ‚Π΅Π½Π° ΠΎΠ΄Π½Π° ваТная Π΄Π΅Ρ‚Π°Π»ΡŒ – ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. А Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли опСрация Π² управляСмом ΠΊΠΎΠ΄Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрировано ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅? ΠžΡ‚Π²Π΅Ρ‚ простой – ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Β«Ρ€ΡƒΡ…Π½Π΅Ρ‚Β».

Рассмотрим класс Class3, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт свойство Age, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого свойства провСряСтся ΠΏΡ€ΠΈ установкС, ΠΈ, Ссли ΠΎΠ½ΠΎ большС 150 ΠΈΠ»ΠΈ мСньшС 0, гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ System::AgrumentException.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ – это ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСуправляСмый класс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π² управляСмом ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ System::ArgumentException Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ тСкстовоС описаниС ошибки для нСуправляСмого ΠΊΠΎΠ΄Π°.

ВсС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² Class3Wrapper – Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetAge() ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ управляСмоС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ нСуправляСмоС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Если функция Π² управляСмом ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ для всСх этих ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΈΠ»ΠΈ просто ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ System::Exception. Π­Ρ‚ΠΎ ΡƒΠΆΠ΅ зависит ΠΎΡ‚ потрСбностСй вашСго прилоТСния.

Class3Wrapper ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π»ΡŽΠ±ΠΎΠΌΡƒ нСуправляСмому классу, функция ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

4 Π Π°Π±ΠΎΡ‚Π° с Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°ΠΌΠΈ

Рассмотрим класс Class4, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ событиС SampleEvent.

Π’Π°ΠΌ, Π³Π΄Π΅ Π² управляСмом ΠΊΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹, Π² нСуправляСмом ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. Π’ Π‘++ это ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½, boost::function (Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΆΠ΅ ΠΈ std::tr1::function, для этого Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ с сайта Microsoft Visual C++ 2008 Feature Pack) ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Для простоты я воспользовался ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹ ΠΆΠ΅ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ, Π½Π° вашС усмотрСниС.

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

Π‘ использованиСм Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… макросов, Class4Wrapper Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

5 ΠžΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Π½Π°Π΄ log4net

РСализация ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с log4net достаточно проста, ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ всС описанныС Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ возмоТности. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π»ΠΎΠ³Π°ΠΌΠΈ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ события. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, для Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с log4net ΠΌΠ½Π΅ достаточно ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ всСго лишь Ρ‚Ρ€ΠΈ класса, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π΄Π²Π° ΠΈΠ· Π½ΠΈΡ… содСрТат Ρ‚ΠΎΠ»ΡŒΠΊΠΎ статичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ Π½Π°Π΄ интСрфСйсом log4net::ILog.

РСализация ΠΎΠ±ΠΎΠ»ΠΎΡ‡Π΅ΠΊ Π½Π°Π΄ log4net::LogManager ΠΈ log4net::Config::XmlConfigurator Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‚.ΠΊ. эти классы состоят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· статичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Π½Π°Π΄ log4net Ρ‚Π°ΠΊΠΆΠ΅ достаточно простоС.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рисункС 3.

управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. Figure3. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄-Figure3. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Figure3. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с запуском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ C/C++, которая Ρ‚Π°ΠΊΠΆΠ΅ называСтся "нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ". Π’ ΠΌΠΈΡ€Π΅ нСуправляСмого ΠΊΠΎΠ΄Π° практичСски Π·Π° всС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист. Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опСрационная систСма (ОБ) Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ запускаСт. Π—Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΎΡ‚ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктов бСзопасности β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист.
Рисунок 3. Π Π°Π±ΠΎΡ‚Π° с log4net ΠΈΠ· нСуправляСмого ΠΊΠΎΠ΄Π°.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π½Π΅ вся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ log4net, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ. Но с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса ManagedObject достаточно просто ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Π½Π°Π΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ классами.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ управляСмый/нСуправляСмый ΠΊΠΎΠ΄ Π² C#?

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ управляСмый ΠΈ нСуправляСмый ΠΊΠΎΠ΄? Π― Π½Π΅ понимаю.

12 ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²

Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ нСуправляСмый ΠΊΠΎΠ΄ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, API собствСнного ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Win32). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΏΠ΅Ρ€ΠΈΠΌΠ΅Ρ‚Ρ€Π° бСзопасности для управляСмого ΠΊΠΎΠ΄Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

Π²ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ бСсплатноС объяснСниС управляСмого ΠΊΠΎΠ΄Π°:

Π― Π΄ΡƒΠΌΠ°ΡŽ, это ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ NUnit выполняСт ваш ΠΊΠΎΠ΄ для UnitTesting ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ, которая нСуправляСма. Но я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, поэтому Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΠΉΡ‚Π΅ это Π·Π° Π·ΠΎΠ»ΠΎΡ‚ΠΎ. Π― ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ смоТСт Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± этом. НадСюсь, это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚!

этой Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ ΠΎ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π΅.

ΡƒΡ€ΠΎΠΆΠ΅Π½Ρ†Π° ΠΊΠΎΠ΄ часто являСтся синонимом нСуправляСмого, Π½ΠΎ Π½Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½.

ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΠΎ нСуправляСмыС, Π΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ машин-спСцифичСский, машин-Ρ€ΠΎΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Как ассСмблСрС x86. НСуправляСмый (Ρ€ΠΎΠ΄Π½ΠΎΠΉ) ΠΊΠΎΠ΄ компилируСтся ΠΈ связываСтся для запуска нСпосрСдствСнно Π½Π° процСссорС, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ всС ОБ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Он Π½Π΅ пСрСносной, Π½ΠΎ быстрый. ΠžΡ‡Π΅Π½ΡŒ простой, ΡƒΡ€Π΅Π·Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… словах, ΠΊΠ°ΠΊ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ:

NUnit Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ тСсты Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ AppDomain, ΠΈ я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π½Π΅ вызываСтся (вСроятно, Π½Π΅ трСбуСтся), поэтому сборка записи Ρ€Π°Π²Π½Π° null.

УправляСмый Код:
Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ «Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Ρƒ ΠΎ сотрудничСствС» с общСязыковая срСда выполнСния. УправляСмый ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для выполнСния оказания услуг, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΏΠ°ΠΌΡΡ‚ΡŒ управлСния, ΠΌΠ΅ΠΆΡŠΡΠ·Ρ‹ΠΊΠΎΠ²Π°Ρ интСграция, ΠΊΠΎΠ΄ доступа, ΠΈ автоматичСский ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ Π½Π° основС Microsoft ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык (MSIL) выполняСтся ΠΊΠ°ΠΊ управляСмый ΠΊΠΎΠ΄.

ООН-УправляСмый Код:
Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° соглашСния ΠΈ трСбования срСды выполнСния common language. НСуправляСмый ΠΊΠΎΠ΄ выполняСтся Π² срСдС CLR с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ слуТбы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅Ρ‚ сборки мусора, ограничСнная ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ Ρ‚. Π΄.).

OTOH,unmanged code Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ спСцифичСскоС ΠΊ машинС ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ для использования, никакая ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π°Π»Π΅Π΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, выводящий Π½Π° экран возраст ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:
исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ понятно:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ CLR?

CLR (Common language runtime) β€” общСязыковая ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ срСда. Она обСспСчиваСт ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ языков ΠΈ позволяСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ благодаря стандартному Π½Π°Π±ΠΎΡ€Ρƒ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌ), созданным Π½Π° ΠΎΠ΄Π½ΠΎΠΌ языкС, Π±Ρ‹Ρ‚ΡŒ Β«Ρ€Π°Π²Π½ΠΎΠΏΡ€Π°Π²Π½Ρ‹ΠΌΠΈ Π³Ρ€Π°ΠΆΠ΄Π°Π½Π°ΠΌΠΈΒ» ΠΊΠΎΠ΄Π°, написанного Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами CLR этот Ρ‚ΠΎΡ‚ самый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ Π½Π°ΠΌ порядкС, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, управляя Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. И всС это для Ρ€Π°Π·Π½Ρ‹Ρ… языков (c#, VisualBasic, Fortran). Π”Π°, CLR Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ управляСт процСссом выполнСния ΠΊΠΎΠΌΠ°Π½Π΄ (машинного ΠΊΠΎΠ΄Π°, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅) ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ кусок ΠΊΠΎΠ΄Π° (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ) ΠΎΡ‚ ΠΊΡƒΠ΄Π° Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΊΡƒΠ΄Π° ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ прямо Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΎΡ†Π΅ΡΡ компиляции прСдставлСн Π½Π° рисункС:
управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. c16b9d5c218c0b445e5a119d3f280f74. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄-c16b9d5c218c0b445e5a119d3f280f74. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° c16b9d5c218c0b445e5a119d3f280f74. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с запуском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ C/C++, которая Ρ‚Π°ΠΊΠΆΠ΅ называСтся "нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ". Π’ ΠΌΠΈΡ€Π΅ нСуправляСмого ΠΊΠΎΠ΄Π° практичСски Π·Π° всС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист. Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опСрационная систСма (ОБ) Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ запускаСт. Π—Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΎΡ‚ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктов бСзопасности β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€, ΠΏΠΎΠΌΠΈΠΌΠΎ ассСмблСра IL создаСт ΠΏΠΎΠ»Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅.

ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ β€” Π½Π°Π±ΠΎΡ€ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ† Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅. Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° Ρ‡Ρ‚ΠΎ ссылаСтся управляСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ числа). Они Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ возмоТности Ρ‚Π°ΠΊΠΈΡ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ языка описания интСрфСйсов (IDL). ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ всСгда связаны с Ρ„Π°ΠΉΠ»ΠΎΠΌ с IL ΠΊΠΎΠ΄ΠΎΠΌ, фактичСски ΠΎΠ½ΠΈ встроСны Π² *.exe ΠΈΠ»ΠΈ *.dll.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ это Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ поля, говорящиС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ находится Π² Ρ‚Π°ΠΊΠΎΠΌ-Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Π΅ ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‚Π°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΡƒ(классу).
Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядят ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ для ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° (Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… просто ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² понятный Π²ΠΈΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ дизассСмблСра ILdasm.exe. На самом Π΄Π΅Π»Π΅ это Ρ‡Π°ΡΡ‚ΡŒ *.exe Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. 3d204305e5f05718353d9508c95c62ed. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄-3d204305e5f05718353d9508c95c62ed. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° 3d204305e5f05718353d9508c95c62ed. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с запуском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ C/C++, которая Ρ‚Π°ΠΊΠΆΠ΅ называСтся "нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ". Π’ ΠΌΠΈΡ€Π΅ нСуправляСмого ΠΊΠΎΠ΄Π° практичСски Π·Π° всС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист. Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опСрационная систСма (ОБ) Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ запускаСт. Π—Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΎΡ‚ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктов бСзопасности β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист.

Π Π°Π·ΠΎΠ±Ρ€Π°Π²ΡˆΠΈΡΡŒ с основными понятиями, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим ΠΈΠ· Ρ‡Π΅Π³ΠΎ ΠΆΠ΅ состоит Ρ‚ΠΎΡ‚ самый управляСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (ΠΈΠ»ΠΈ просто наш Ρ„Π°ΠΉΠ» ConsoleApplication_Test_Csharp.exe, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт Π²Ρ‹Π²ΠΎΠ΄ Π½Π° экран возраста ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°):

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ Ρ‚ΠΈΠΏΠ΅ процСссора Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. Π Π•32 (для 32 ΠΈ 64 Π±ΠΈΡ‚Π½Ρ‹Ρ… ОБ) ΠΈΠ»ΠΈ Π Π•32+ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для 64 Π±ΠΈΡ‚Π½Ρ‹Ρ… ОБ)
Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ CLR β€” содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² управляСмый (Ρ„Π»Π°Π³ΠΈ, вСрсия CLR, Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² Main())
ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ β€” 2 Π²ΠΈΠ΄Π° Ρ‚Π°Π±Π»ΠΈΡ† ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…:
1) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² исходном ΠΊΠΎΠ΄Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ Ρ‡Π»Π΅Π½Ρ‹
2) Ρ‚ΠΈΠΏΡ‹ ΠΈ Ρ‡Π»Π΅Π½Ρ‹, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ссылки Π² исходном ΠΊΠΎΠ΄Π΅.
Код IL β€” Код, создаваСмый компилятором ΠΏΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π° Π½Π° C#. Π—Π°Ρ‚Π΅ΠΌ IL прСобразуСтся Π² процСссорныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (0001 0011 1101… ) ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ CLR (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅ JIT)

Π Π°Π±ΠΎΡ‚Π° JIT

И Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ происходит, ΠΊΠΎΠ³Π΄Π° запускаСтся Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°?
Π‘ΠΏΠ΅Ρ€Π²Π° происходит Π°Π½Π°Π»ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ процСсс Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ (32 ΠΈΠ»ΠΈ 64 разрядный). Π—Π°Ρ‚Π΅ΠΌ загруТаСтся выбранная вСрсия Ρ„Π°ΠΉΠ»Π° MSCorEE.dll ( C:\Windows\System32\MSCorEE.dll для 32разрядных процСссоров)
ПослС Ρ‡Π΅Π³ΠΎ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄, располоТСнный MSCorEE.dll, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ CLR, сборки ΠΈ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Main() нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Для выполнСния ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ System.Console.WriteLine(Β«Hello β€ž), IL Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (Ρ‚Π΅ самыС Π½ΡƒΠ»ΠΈ ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹) Π­Ρ‚ΠΈΠΌ занимаСтся Jiter ΠΈΠ»ΠΈ just-in-time compiler.

Π‘ΠΏΠ΅Ρ€Π²Π°, ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Main() срСда CLR Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ всС ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏ Console).
Π—Π°Ρ‚Π΅ΠΌ опрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, объСдиняя ΠΈΡ… Π² записи Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΉ β€œΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹Β» (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Π² Ρ‚ΠΈΠΏΠ΅ Console).
Записи содСрТат адрСса, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (Ρ‚.Π΅. Ρ‚Π΅ прСобразования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выполняСт ΠΌΠ΅Ρ‚ΠΎΠ΄).

управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. d97c0acd1c164af2e91b81ea2d70087e. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄-d97c0acd1c164af2e91b81ea2d70087e. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° d97c0acd1c164af2e91b81ea2d70087e. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с запуском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ C/C++, которая Ρ‚Π°ΠΊΠΆΠ΅ называСтся "нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ". Π’ ΠΌΠΈΡ€Π΅ нСуправляСмого ΠΊΠΎΠ΄Π° практичСски Π·Π° всС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист. Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опСрационная систСма (ОБ) Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ запускаСт. Π—Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΎΡ‚ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктов бСзопасности β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист.

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WriteLine вызываСтся JiT-compiler.
JiTer ‘Ρƒ извСстны Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ этот ΠΌΠ΅Ρ‚ΠΎΠ΄.
JiTer ΠΈΡ‰Π΅Ρ‚ Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ сборки β€” Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (ΠΊΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° WriteLine(string str) ).
Π—Π°Ρ‚Π΅ΠΌ, ΠΎΠ½ провСряСт ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ IL Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ (собствСнныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹), сохраняя Π΅Π³ΠΎ Π² динамичСской памяти.
ПослС JIT Compiler возвращаСтся ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ «структурС» Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° (Console) ΠΈ замСняСт адрСс Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π½Π° адрСс Π±Π»ΠΎΠΊΠ° памяти с исполняСмыми процСссорными ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ.
ПослС этого ΠΌΠ΅Ρ‚ΠΎΠ΄ Main() обращаСтся ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ WriteLine(string str) ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. Π’.ΠΊ. ΠΊΠΎΠ΄ ΡƒΠΆΠ΅ скомпилирован, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ производится минуя JiT Compiler. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ WriteLine(string str) ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ возвращаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Main().

Из описания слСдуСт, Ρ‡Ρ‚ΠΎ Β«ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΒ» Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ функция Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΊΠΎΠ³Π΄Π° JIT ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ IL ΠΊΠΎΠ΄ Π² инструкции процСссора. Π’ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях ΠΊΠΎΠ΄ ΡƒΠΆΠ΅ находится Π² памяти ΠΈ подставляСтся ΠΊΠ°ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСссора. Однако Ссли Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ процСссС, Ρ‚ΠΎ Jiter Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ снова для Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ выполняСмых Π² Ρ…86 срСдС JIT гСнСрируСтся 32-разрядныС инструкции, Π² Ρ…64 ΠΈΠ»ΠΈ IA64 срСдах β€” соотвСтствСнно 64-разрядныС.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠ΄Π°. УправляСмый ΠΈ нСуправляСмый ΠΊΠΎΠ΄

IL ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, Ρ‚.Π΅. ΠΈΠ· Π½Π΅Π³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ IL β€” ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ NOP (пустая ΠΊΠΎΠΌΠ°Π½Π΄Π°). Для этого ΠΏΡ€ΠΈ компиляции Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

Π§Π΅ΠΌ ΠΆΠ΅ отличаСтся управляСмый ΠΊΠΎΠ΄ ΠΎΡ‚ нСуправляСмого?

НСуправляСмый ΠΊΠΎΠ΄ компилируСтся для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ процСссора ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ просто исполняСтся.

Π’ управляСмой срСдС компиляция производится Π² 2 этапа:

1) компилятор ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ C# ΠΊΠΎΠ΄ Π² IL
2) для исполнСния Π½ΡƒΠΆΠ½ΠΎ пСрСвСсти IL ΠΊΠΎΠ΄ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ процСссора, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏ. динамичСской памяти ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π° самая Ρ€Π°Π±ΠΎΡ‚Π° JIT).

ВзаимодСйствиС с нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ:

β€” управляСмый ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· DLL посрСдствам P/Invoke (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ CreateSemaphore ΠΈΠ· Kernel32.dll).
β€” управляСмый ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ COM-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ (сСрвСр).
β€” нСуправляСмый ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ управляСмый Ρ‚ΠΈΠΏ (сСрвСр). МоТно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ COM β€” ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² управляСмой срСдС ΠΈ Ρ‚ΠΎΠ³Π΄Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ вСсти подсчСт ссылок интСрфСйсов.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ /clr позволяСт ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Visual Π‘++ ΠΊΠΎΠ΄ Π² управляСмыС IL ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠΎΠ³Π΄Π°, содСрТащСго ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ассСмблСрными вставками ( __asm ), ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ встроСнныС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ( __enable, _RetrurAddress )). Если этого ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ получится, Ρ‚ΠΎ ΠΊΠΎΠ΄ скомпилируСтся Π² стандартныС Ρ…86 ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π”Π°Π½Π½Ρ‹Π΅ Π² случаС IL ΠΊΠΎΠ΄Π° Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ управляСмыми (ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ) ΠΈ Π½Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ сборщиком мусора (это касаСтся Π‘++ ΠΊΠΎΠ΄Π°).

БистСма Ρ‚ΠΈΠΏΠΎΠ²

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ систСмС Ρ‚ΠΈΠΏΠΎΠ² CTS, принятой Microsoft.

CTS (Common Type System) β€” общая систСма Ρ‚ΠΈΠΏΠΎΠ² Π² CLR (Ρ‚ΠΈΠΏ, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ β€” это Π°Π½Π°Π»ΠΎΠ³ класса C#). Π­Ρ‚ΠΎ β€” стандарт, ΠΏΡ€ΠΈΠ·Π½Π°Π½Π½Ρ‹ΠΉ ECMA ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΈΡ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΆΠ΅ опрСдСляСт ΠΏΡ€Π°Π²ΠΈΠ»Π° наслСдования, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ПослС рСгистрации ECMA стандарт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π½Π°Π·Π²Π°Π½ΠΈΠ΅ CLI ( Common Language Infrastructure)

β€” CTS ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ΅ наслСдованиС (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π‘++)
β€” ВсС Ρ‚ΠΈΠΏΡ‹ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ System.Object (Object β€” имя Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ€Π΅Π½ΡŒ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², System β€” пространство ΠΈΠΌΠ΅Π½)

По спСцификации CTS любой Ρ‚ΠΈΠΏ содСрТит 0 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π»Π΅Π½ΠΎΠ².

ПолС β€” пСрСмСнная, Ρ‡Π°ΡΡ‚ΡŒ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ Ρ‚ΠΈΠΏΡƒ.
ΠœΠ΅Ρ‚ΠΎΠ΄ β€” функция, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ дСйствиС Π½Π°Π΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Π˜ΠΌΠ΅Π΅Ρ‚ имя, сигнатуру(число ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π²ΠΎΠ·Π²Ρ€. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹.
Бвойство β€” Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ выглядит ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄ (get/set) Π° для Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ стороны ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π΅ ( = ). Бвойства ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ‚ΠΈΠΏΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ β€” обСспСчиваСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ увСдомлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Public β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ доступСн Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ ΠΈΠ· любой сборки
Private β€” ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ°
Family (protected) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ нСзависимо ΠΎΡ‚ сборки
Assembly (internal) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся Π»ΡŽΠ±Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠ· Ρ‚ΠΎΠΉ ΠΆΠ΅ сборки
Family or Assembly
(protected internal) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈΠ· любой сборки ΠΈ + Π»ΡŽΠ±Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈΠ· Ρ‚ΠΎΠΉ ΠΆΠ΅ сборки.

CLS (Common Language Specification) β€” спСцификации выпущСнная ΠœΠ°ΠΉΠΊΡ€ΠΎΡΠΎΡ„Ρ‚. Она описываСт ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ возмоТностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ компиляторов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π² CLR. CLR/CTS ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ большС возмоТностСй, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… CLS. АссСмблСр IL ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ CLR/CTS. Π―Π·Ρ‹ΠΊΠΈ (C#, Visual Basic) ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‡Π°ΡΡ‚ΡŒ возмоТностСй CLR/CTS (Π² Ρ‚.Ρ‡. ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΡ‚ CLS).
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° рисункС

управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. 8fd82d92c8e55fca54ae6fbe29ea1c48. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄ Ρ„ΠΎΡ‚ΠΎ. управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄-8fd82d92c8e55fca54ae6fbe29ea1c48. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° управляСмый ΠΊΠΎΠ΄ ΠΈ нСуправляСмый ΠΊΠΎΠ΄. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° 8fd82d92c8e55fca54ae6fbe29ea1c48. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с запуском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ C/C++, которая Ρ‚Π°ΠΊΠΆΠ΅ называСтся "нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ". Π’ ΠΌΠΈΡ€Π΅ нСуправляСмого ΠΊΠΎΠ΄Π° практичСски Π·Π° всС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист. Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опСрационная систСма (ОБ) Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ запускаСт. Π—Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΎΡ‚ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктов бСзопасности β€” ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ программист.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° соотвСтствиС CLS

Атрибут [assembly: CLSCompliant(true)] заставляСт компилятор ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ доступныС ΠΈΠ·Π²Π½Π΅ Ρ‚ΠΈΠΏΡ‹, содСрТащиС конструкции, нСдопустимыС Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: UInt32 Abc() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ цСлочислСнноС Ρ†Π΅Π»ΠΎΠ΅ Π±Π΅Π· Π·Π½Π°ΠΊΠ°. Visaul Basic, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ‚Π°ΠΊΠΈΠΌΠΈ значСниями.
Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅: Π΄Π²Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Abc() ΠΈ abc() β€” ΠΎΠ΄ΠΈΠ½ΠΎΠΊΠ²Ρ‹Π΅ ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ лишь рСгистром Π±ΡƒΠΊΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. VisualBasic Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Π£Π±Ρ€Π°Π² public ΠΈ оставив Ρ‚ΠΎΠ»ΡŒΠΊΠΎ sealed class SomeLibraryType ΠΎΠ±Π° прСдупрСТдСния исчСзнут. Π’Π°ΠΊ ΠΊΠ°ΠΊ SomeLibraryType ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ internal ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π΅Π½ ΠΈΠ·Π²Π½Π΅ сборки.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ управляСмый ΠΈΠ»ΠΈ нСуправляСмый ΠΊΠΎΠ΄ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ?

Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² ΠΌΠΎΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ Π‘#, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, говорят, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠ»ΠΎΡ…ΠΎ сСбя Π²Π΅Π΄Π΅Ρ‚ Π² β€œΠ½Π΅ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΠΎΠΌβ€ ΠΊΠΎΠ΄Π΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ управляСмый ΠΈΠ»ΠΈ нСуправляСмый ΠΊΠΎΠ΄?

Π’ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠΉ тСкст ΠΈΠ· MSDN ΠΎ нСуправляСмый ΠΊΠΎΠ΄.

НСкоторому Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ нСуправляСмый ΠΊΠΎΠ΄ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, собствСнныС API-интСрфСйсы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Win32). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ бСзопасности для управляСмого ΠΊΠΎΠ΄Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

Π’ΠΎΡ‚ Π΅Ρ‰Π΅ нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… объяснСний ΠΎΠ± управляСмом ΠΊΠΎΠ΄Π΅:

Для вашСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

Π― Π΄ΡƒΠΌΠ°ΡŽ, это ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ NUnit выполняСт ваш ΠΊΠΎΠ΄ для UnitTesting ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π΅Π³ΠΎ нСуправляСмого. Но я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½ Π² этом, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΠΉΡ‚Π΅ это Π·Π° Π·ΠΎΠ»ΠΎΡ‚ΠΎ. Π― ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ смоТСт Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± этом. НадСюсь, это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚!

Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π° эту Ρ‚Π΅ΠΌΡƒ.

ИсполняСмая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая запускаСтся сама ΠΏΠΎ сСбС. ЗапущСнная ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС, Π½ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ использования Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ систСмы. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС ассСмблСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ собраны Π½Π° машинном языкС, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° C/C++, скомпилированныС Π½Π° машинном языкС для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ нСуправляСмого ΠΊΠΎΠ΄Π° (Ρ€Π΅ΠΆΠΈΠΌ чтСния).

БобствСнный ΠΊΠΎΠ΄ часто являСтся синонимом Unmanaged, Π½ΠΎ Π½Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½.

Когда Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΠΎ нСуправляСмом, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎΠ± машинном ΠΊΠΎΠ΄Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Как язык ассСмблСра x86. НСуправляСмый (собствСнный) ΠΊΠΎΠ΄ скомпилирован ΠΈ связан для запуска нСпосрСдствСнно Π½Π° процСссорС, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ всСго ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ОБ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΡ€Ρ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ, Π½ΠΎ быстрый. ΠžΡ‡Π΅Π½ΡŒ простой, ΡƒΡ€Π΅Π·Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· управляСмой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, скаТСм, Π² Π½Π΅ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сами ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ самому фактичСскому ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Он, вСроятно, Π·Π°Π²Π΅Ρ€Π½ΡƒΡ‚ ΠΈΠ»ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½ Π² ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ. НСуправляСмыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, β€œint”, скаТСм) – Π½Π° 32-Π±ΠΈΡ‚Π½ΠΎΠΉ машинС – Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Ρ€ΠΎΠ²Π½ΠΎ 4 Π±Π°ΠΉΡ‚Π°. Накладных ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΎΠΊ Π½Π΅Ρ‚. ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΎΡ‚ управляСмого ΠΊ нСуправляСмому ΠΊΠΎΠ΄Ρƒ – ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ – называСтся β€œ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³β€œ. Π­Ρ‚ΠΎ позволяСт вашим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ.

Π’ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… словах:

NUnit Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ тСсты Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ AppDomain, ΠΈ я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π½Π΅ вызываСтся (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ Π½ΡƒΠΆΠ½Π°), поэтому сборка Π²Π²ΠΎΠ΄Π° являСтся Π½ΡƒΠ»Π΅Π²ΠΎΠΉ.

УправляСмый ΠΊΠΎΠ΄:
Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ΄ β€œΠ΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΎΠΌ ΠΎ сотрудничСствС” с ΠΎΠ±Ρ‰Π΅Π΅ врСмя выполнСния. УправляСмый ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для срСды выполнСния для прСдоставлСния Ρ‚Π°ΠΊΠΈΡ… услуг, ΠΊΠ°ΠΊ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, мСТязыковая интСграция, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ доступа ΠΊ ΠΊΠΎΠ΄Ρƒ ΠΈ автоматичСский ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ Π½Π° основС Microsoft ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык (MSIL) выполняСтся ΠΊΠ°ΠΊ управляСмый ΠΊΠΎΠ΄.

НС управляСмый ΠΊΠΎΠ΄:
Код, созданный Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° соглашСния ΠΈ трСбования ΠΊ срСдС ΠΎΠ±Ρ‰Π΅Π³ΠΎ языка. НСуправляСмый ΠΊΠΎΠ΄Π° выполняСтся Π² срСдС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ языка исполнСния с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ услуг (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, отсутствиС сбора мусора, ограничСнная ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅).

OTOH, Π½Π΅Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ – это Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ для ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΊ использованию, Π½Π΅Ρ‚ нСобходимости ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ дальшС.

УправляСмый ΠΊΠΎΠ΄ – это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ компиляторы Π‘#.Net, VB.Net, F #.Net ΠΈ Ρ‚.Π΄. Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² срСдС CLR, которая, ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ слуТбы, ΠΊΠ°ΠΊ сборка мусора, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ссылок ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, ΠΌΠΎΠΉ ΠΊΠΎΠ΄ управляСтся CLR.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, нСуправляСмый ΠΊΠΎΠ΄ компилируСтся прямо Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ Π½Π΅ управляСт CLR.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *