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

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

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

   ldstr "Junior"

   // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ CILCar: сохранСниС ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ссылки.

   newobj: instance void [CILCars] CILCars.CILCar::.сtor(int32, string)

   stloc.0

   ldloc.0

   // Π’Ρ‹Π·ΠΎΠ² Display() ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ значСния ΠΈΠ· стСка.

   call void [CILCars] CILCars.CILCarInfo::Display(class [CILCars]CILCars.CILCar)

   ret

  }

 }

}

Π—Π΄Π΅ΡΡŒ СдинствСнным ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ коммСнтария, являСтся .entrΡƒpoint. Напомним, Ρ‡Ρ‚ΠΎ этот ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обозначСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² качСствС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° модуля *.eΡ…Π΅. Π’Π²ΠΈΠ΄Ρƒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ срСда CLR ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ для выполнСния ΠΈΠΌΠ΅Π½Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ.entrypoint, сам ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΡƒΠ³ΠΎΠ΄Π½ΠΎ (хотя Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ½ называСтся Main()). Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ CIL-ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Main() прСдставляСт дСйствия, связанныС с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² стСк ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΡ… ΠΈΠ· стСка.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‡Ρ‚ΠΎ для создания CILCar ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.newobj. Π’ связи с этим Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ‡Π»Π΅Π½Π° Ρ‚ΠΈΠΏΠ° нСпосрСдствСнно Π² CIL Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ синтаксис с использованиСм Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ двоСточия ΠΈ, ΠΊΠ°ΠΊ всСгда, ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ имя Ρ‚ΠΈΠΏΠ°. Восприняв сказанноС, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ilasm.exe, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ peverifΡƒ.exe, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

ilasm CilCarClient.il

peverify CilCarClient.exe

CILCarClient.exe

На рис. 15.5 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Рис. 15.5. Π’Π°Ρˆ CILCar Π² дСйствии

На этом, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ этой Π³Π»Π°Π²Ρ‹, ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ освоСниС Π°Π·Π±ΡƒΠΊΠΈ CIL. К этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ, я надСюсь, Π²Ρ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ смоТСтС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ любой ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ .NET с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ildasm.exe ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ происходит Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ.

ДинамичСскиС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, процСсс создания слоТного прилоТСния .NET нСпосрСдствСнно Π² CIL оказываСтся довольно Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΌ. Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, CIL являСтся Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ языком программирования, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ со всСми ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ конструкциями, допустимыми Π² CTS. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, созданиС CIL-ΠΊΠΎΠ΄Π° являСтся Π΄Π΅Π»ΠΎΠΌ скучным, ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ сопряТСнным с мноТСством ошибок. Π₯отя Π²Π΅Ρ€Π½ΠΎ ΠΈ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Π½ΠΈΠ΅ – это сила, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ это Ρ‚Π°ΠΊ Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ "Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ" Π·Π°ΠΊΠΎΠ½Π°ΠΌΠΈ синтаксиса CIL свою ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π― ΠΎΡ‚Π²Π΅Ρ‡Ρƒ Ρ‚Π°ΠΊ: это зависит ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π²Π°ΡˆΠΈΡ… .NET-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ нСпосрСдствСнно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ CIL Π½Π΅ потрСбуСтся. Но, освоив Π°Π·Π±ΡƒΠΊΡƒ CIL, Π²Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ динамичСских ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ статичСским ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌ Π±Π»ΠΎΠΊΠ°ΠΌ) ΠΈ Ρ€ΠΎΠ»ΠΈ пространства ΠΈΠΌΠ΅Π½ System.Reflection.Emit.

Π—Π΄Π΅ΡΡŒ сразу ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ вопрос: "Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ статичСскими ΠΈ динамичСскими ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ?" По ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, статичСскиС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ .NET, Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹ΠΌΠΈ ΠΏΠΎ запросу CLR нСпосрСдствСнно с диска (Π² ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π³Π΄Π΅-Ρ‚ΠΎ Π½Π° вашСм ТСстком дискС Π² физичСском Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²ΠΎ мноТСствС Ρ„Π°ΠΉΠ»ΠΎΠ², Ссли ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ являСтся ΠΌΠ½ΠΎΠ³ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ). Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ сами, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ исходный ΠΊΠΎΠ΄ C#, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ статичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, создаСтся Π² памяти "Π½Π° Π»Π΅Ρ‚Ρƒ", с использованиСм Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Ρ… пространством ΠΈΠΌΠ΅Π½ System. Reflection.Emit. ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ System.Reflection.Emit Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ созданиС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CIL прямо Π² срСдС выполнСния. Π‘ΠΎΠ·Π΄Π°Π² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свой находящийся Π² памяти Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π° диск. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, получится Π½ΠΎΠ²Ρ‹ΠΉ статичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ. Для понимания процСсса построСния динамичСского ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ пространства ΠΈΠΌΠ΅Π½ System.Reflection.Emit трСбуСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ понимания ΠΊΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, созданиС динамичСских ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² являСтся довольно слоТным (ΠΈ Π½Π΅ слишком часто примСняСмым) ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠΌ программирования, Π½ΠΎ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°Ρ…,

β€’ ΠŸΡ€ΠΈ создании инструмСнтов программирования .NET. ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ динамичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ Π² зависимости ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°.

β€’ ΠŸΡ€ΠΈ создании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, способных динамичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Π³Π΅Π½Ρ‚Ρ‹ доступа ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ Π½Π° основС ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ….

β€’ ΠŸΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ статичСских ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² с динамичСским Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·.

Учитывая сказанноС, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ‚ΠΈΠΏΡ‹, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ Π² System.Reflection.Emit.

ИсслСдованиС пространства ΠΈΠΌΠ΅Π½ System.Reflection.Emit

Для создания динамичСского ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° трСбуСтся Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL, Π½ΠΎ Ρ‚ΠΈΠΏΡ‹ пространства ΠΈΠΌΠ΅Π½ System.Reflection. Emit Π² максимальной ΠΌΠ΅Ρ€Π΅ "ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ" ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ CIL. НапримСр, вмСсто прямого указания Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² CIL ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° класса Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс TypeBuilder. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ конструктор уровня экзСмпляра, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ specialname, rtspecialname ΠΈ лСксСмы .ctor – вмСсто этого ΠΌΠΎΠΆΠ½ΠΎ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ConstructorBuilder. Описания ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² пространства ΠΈΠΌΠ΅Π½ System.Reflection.Emit приводятся Π² Ρ‚Π°Π±Π». 15.8.

Π’Π°Π±Π»ΠΈΡ†Π° 15.8. Π˜Π·Π±Ρ€Π°Π½Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ пространства ΠΈΠΌΠ΅Π½ System.Reflection.Emit

Π§Π»Π΅Π½Ρ‹ ОписаниС AssemblyBuilder Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° (*.dll ΠΈΠ»ΠΈ *.exe) Π² срСдС выполнСния. Π’ случаС *.exe слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ModuleBuilder.SetEntryPoint(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π²Ρ…ΠΎΠ΄Π° Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Если Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π°, Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирована *.dll ModuleBuilder Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния мноТСства ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° EnumBuilder Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Ρ‚ΠΈΠΏΠ° пСрСчня .NET TypeBuilder ΠœΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π»ΠΈ создания классов, интСрфСйсов, структур ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² Π² Ρ€Π°ΠΌΠΊΠ°Ρ… модуля Π² срСдС выполнСния MethodBuilder EventBuilder LocalBuilder PropertyBuilder FieldBuilder ConstructorBuilder CustomAttributeBuilder ParameterBuilder Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для создания Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, свойства, конструкторы ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹) Π² срСдС выполнСния ILGenerator Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ‡Π»Π΅Π½Π΅ Ρ‚ΠΈΠΏΠ° OpCodes ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ мноТСство ΠΏΠΎΠ»Π΅ΠΉ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΡ…ΡΡ Π² ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вмСстС с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ System.Reflection.Emit.ILGenerator

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Ρ‚ΠΈΠΏΡ‹ пространства ΠΈΠΌΠ΅Π½ System.Reflection.Emit ΠΏΡ€ΠΈ построСнии динамичСского Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ модуля ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ "сырыС" лСксСмы CIL ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ. ВозмоТности использования ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ продСмонстрированы Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π½ΠΎ Ρ‚ΠΈΠΏ ILGenerator заслуТиваСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ обсуТдСния.

Роль System.Reflection.Emit.ILGenerator

Как слСдуСт ΠΈΠ· самого ΠΈΠΌΠ΅Π½ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Ρ€ΠΎΠ»ΡŒ ILGenerator Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL Π² Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅Ρ‚ нСобходимости нСпосрСдствСнно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ILGenerator, Π° Π½ΡƒΠΆΠ½ΠΎ просто ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ссылку Π½Π° Ρ‚ΠΈΠΏ ILGenerator, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΈΠΏΡ‹, связанныС с ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ MethodBuilder ΠΈ ConstructorBuilder). НапримСр:

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ILGenerator ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ConstructorBuilder

// с имСнСм 'myCtorBuilder'.

ConstructorBuilder myCtorBuilder = new ConstructorBuilder (/*…различныС аргумСнты… */);

 ILGenerator myCILGen = myCtorBuilder.GetILGenerator();

ИмСя ILGenerator, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ "сырыС" ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π»ΡŽΠ±Ρ‹Π΅ ΠΈΠ· Ρ†Π΅Π»ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². НСкоторыС (Π½ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π½Π΅ всС) ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ILGenerator описаны Π² Ρ‚Π°Π±Π». 15.9.

Π’Π°Π±Π»ΠΈΡ†Π° 15.9. ΠŸΠΎΠ΄Π±ΠΎΡ€ΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ILGenerator

ΠœΠ΅Ρ‚ΠΎΠ΄ ОписаниС BeginCatchBlock() НачинаСт Π±Π»ΠΎΠΊ catch BeginExceptionBlock() НачинаСт Π±Π»ΠΎΠΊ Π½Π΅ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ BeginFinallyBlock() НачинаСт Π±Π»ΠΎΠΊ finally BeginScope() НачинаСт лСксичСский контСкст DeclareLocal() ΠžΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ DefineLabel() ΠžΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ Emit() ЯвляСтся ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ ΠΈ позволяСт Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL EmitCall() ВставляСт ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ call ΠΈΠ»ΠΈ callvirt Π² ΠΏΠΎΡ‚ΠΎΠΊ CIL EmitWriteLine() Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Console.WriteLine() с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ EndExceptionBlock() Π—Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π±Π»ΠΎΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ EndScope() Π—Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ лСксичСский контСкст ThrowException() Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ для гСнСрирования ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ UsingNamespace() Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ пространство ΠΈΠΌΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΎΡ†Π΅Π½ΠΊΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ лСксичСском контСкстС

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ILGenerator являСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Emit(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² совокупности с Ρ‚ΠΈΠΏΠΎΠΌ класса System.Reflection.Emit.OpCodes. Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² этой Π³Π»Π°Π²Π΅, Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ большой Π½Π°Π±ΠΎΡ€ доступных Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΏΠΎΠ»Π΅ΠΉ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΡ…ΡΡ Π² ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL. ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ эти Ρ‡Π»Π΅Π½Ρ‹ описаны Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ доступной систСмС справки, Π½ΠΎ Ρ†Π΅Π»Ρ‹ΠΉ ряд ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π²Ρ‹ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… страницах.