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

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

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

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

Π’ CIL просто Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ элСмСнтам Π΄Π°Π½Π½Ρ‹Ρ… нСпосрСдствСнно, ΠΈ это касаСтся ΠΊΠ°ΠΊ локально ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². НуТно сначала явно Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ элСмСнт Π² стСк, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‚Π΅ΠΌ "Π²Ρ‹Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒ" Π΅Π³ΠΎ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° для дальнСйшСго использования (ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎΠ± этом, вСдь ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому Π±Π»ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° CIL ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСсколько ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ).

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ CIL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΡ‚Π΅ΠΊΠΎΠ²ΡƒΡŽ модСль, рассмотрим простой C#-ΠΌΠ΅Ρ‚ΠΎΠ΄ PrintMessage(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚. Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²Ρ‹ просто Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ локальной строковой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΏΠΎΡ‚ΠΎΠΊ стандартного Π²Ρ‹Π²ΠΎΠ΄Π°.

public void PrintMessage() {

 string myMessage = "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.";

 ConsolΠ΅.WriteLine(myMessage);

}

Если Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ трансляции этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° компилятором C# Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ CIL, Π²Ρ‹ сразу Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ PrintMessage() опрСдСляСт ячСйку хранСния для локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ.locals. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ строка Π·Π°Ρ‚Π΅ΠΌ загруТаСтся ΠΈ сохраняСтся Π² этой локальной Π½Π΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ldstr (Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° строки) ΠΈ stloc.0 (это ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ "Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с индСксом 0").

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (снова с индСксом 0) Π·Π°Ρ‚Π΅ΠΌ загруТаСтся Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ldloc.0 ("Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ с индСксом 0") для использования Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° System.Console.WriteLine() (ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ call). НаконСц, происходит Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ret.

.method public hidebysig instance void PrintMessage() cil managed {

 .maxstack 1

 // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ локальной строковой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (с индСксом 0).

 .locals init ([0] string myMessage)

 // Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° строки со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ "ΠŸΡ€ΠΈΠ²Π΅Ρ‚."

 ldstr "ΠŸΡ€ΠΈΠ²Π΅Ρ‚."

 // Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ строкового значСния Π² стСкС Π² локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

 stloc.0

 // Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° значСния с индСксом 0.

 ldloc.0

 // Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

 call void [mscorlib]System.Console::WriteLine(string)

 ret

}

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ CIL ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ синтаксис Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ косой Ρ‡Π΅Ρ€Ρ‚Ρ‹ (Π° Ρ‚Π°ΠΊΠΆΠ΅ синтаксис /*…*/). Как ΠΈ Π² C#, компилятором CIL ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

ЧСлночная тСхнология Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

Π’Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ildasm.exe для просмотра ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° CIL, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ компилятором C#. Однако Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ildasm.exe позволяСт Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ CIL-ΠΊΠΎΠ΄, содСрТащийся Π² Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅, Π²ΠΎ внСшний Ρ„Π°ΠΉΠ». ИмСя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ CIL Π² своСм распоряТСнии, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ildasm.exe – компилятора CIL – ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ вновь.

Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ называСтся Ρ‡Π΅Π»Π½ΠΎΡ‡Π½ΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΈ эта тСхнология ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… случаях.

β€’ ΠŸΠ΅Ρ€Π΅Π΄ Π²Π°ΠΌΠΈ стоит Π·Π°Π΄Π°Ρ‡Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚ исходного ΠΊΠΎΠ΄Π°.

β€’ Π’Π²ΠΈΠ΄Ρƒ Π½Π΅ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²Π° компилятора языка .NET, ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅Π³ΠΎ нСэффСктивный ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ CIL, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот ΠΊΠΎΠ΄.

β€’ Π’Ρ‹ создаСтС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… COM, ΠΈ Π²Π°ΠΌ приходится ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ IDL (Interface Definition Language – язык описания интСрфСйса) Π² процСссС прСобразования ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π΅Ρ€ΡΡ‚ΡŒΡΡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, COM-Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [helpstring]).

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования Ρ‡Π΅Π»Π½ΠΎΡ‡Π½ΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ создайтС Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (HelloProgram.cs) исходного ΠΊΠΎΠ΄Π° C# с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π² этом Ρ„Π°ΠΉΠ»Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ класса (ΠΌΠΎΠΆΠ΅Ρ‚Π΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Visual Studio 2005, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» AssemblyInfo.cs, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ объСм Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ CIL-ΠΊΠΎΠ΄Π°).

// ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° языкС C#.

using System;

class Program {

 static void Main(string[] args) {

  Console.WriteLine("Hello CIL code!");

  Console.ReadLine();

 }

}

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ этот Ρ„Π°ΠΉΠ» Π² подходящСм мСстС Π½Π° своСм дискС ΠΈ скомпилируйтС Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ csc.exe.

csc HelloProgram.cs

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» HelloProgram.exe с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ildasm.exe ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΡ†ΠΈΡŽ мСню Fileβ†’Dump, сохранитС "сырой" ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ CIL Π² Π½ΠΎΠ²ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ *.il (HelloProgram.il) На вашСм ТСстком дискС (значСния, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ Π² ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰Π΅ΠΌΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅, Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚ для Π½Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ). Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ этот Ρ„Π°ΠΉΠ», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ любой тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€. Π’ΠΎΡ‚ слСгка ΠΎΡ‚ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² снабТСнный Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ коммСнтариями Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

// ΠšΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ссылаСмся.

.assembly extern mscorlib {

 .publickeytoken = (Π’7 7A 5Π‘ 56 19 34 Π•0 89)

 .ver 2:0:0:0

}

// Π’Π°Ρˆ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

.assembly HelloProgram {

 .hash algorithm 0Ρ…00008004

.ver 0:0:0:0

}

.module HelloProgram.exe

.imagebase 0x00400000

.file alignment 0x00000200

.stackreserve 0x00100000

.subsystem 0x0003

.corflags 0x00000001

// ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса Program.

.class private auto ansi beforefieldinit Program extends [mscorlib]System.Object {

 .method private hidebysig static void Main(string[] args) cil managed {

  // ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°

  // выполняСмого Ρ„Π°ΠΉΠ»Π°.

  .entrypoint

  .maxstack.8

  IL_0000: nop

  IL_0001: ldstr "Hello CIL code!"

  IL_0006: call void [mscorlib]System.Console::WriteLine(string)

  IL_000b: nop

  IL_000c: call string [mscorlib]System.Console::ReadLine()

  IL_0011: pop

  IL_0012: ret

 }

 // ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

 .method public hidebysig specialname rtspecialname instance void .ctor() cil managed {

  .maxstack 8

  IL_0000: ldarg.0

  IL_0001: call instance void [mscorlib]System.Object::.ctor()

  IL_0006: ret

 }

}

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» *.il начинаСтся с объявлСния всСх Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ², Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ссылаСтся Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ. Π—Π΄Π΅ΡΡŒ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ .assembly extern для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ mscorlib.dll. Если Π±Ρ‹ ваша Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° классов использовала Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ², Π²Ρ‹ Π±Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ .assembly extern.

Π”Π°Π»Π΅Π΅ слСдуСт Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ вашСго ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° HelloProgram.exe, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π° вСрсия 0.0.0.0, назначаСмая ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ссли Π²Ρ‹ Π½Π΅ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ ΠΈΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° [AssemblyVersion]). ПослС этого приводятся Π΄Ρ€ΡƒΠ³ΠΈΠ΅ описания ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ CIL (Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ .module, .imagebase ΠΈ Ρ‚.Π΄.).

ПослС указания ссылок Π½Π° внСшниС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ ΠΈ опрСдСлСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΈΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Program. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°.class ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹), – Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ extends, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Ρ‚ΠΈΠΏΠ°.

.class private auto ansi beforefieldinit Program extends [mscorlib]System.Object {…}

Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ кусок ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° CIL соотвСтствуСт конструктору класса, Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Main(). Оба ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ (Π² частности) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ .method. ПослС опрСдСлСния этих Ρ‡Π»Π΅Π½ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ подходящих Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² CIL ΠΏΡ€ΠΈ взаимодСйствии с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ .NET (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с System.Console) всСгда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠΎΠ². Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΈΠΏΠ° всСгда Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒΡΡ (Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках) прСфикс с понятным ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ этот Ρ‚ΠΈΠΏ. ВзглянитС Π½Π° CIL-Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Main().

.method private hidebysig static void Main(string[] args) cil managed {

 .entrypoint

 .maxstack 8

 IL_0000: nop

 IL_0001: ldstr "Hello CIL code!"

 IL_0006: call void [mscorlib]System.Console::WriteLine(string)

 IL_000b: nop

 IL_000c: call string [mscorlib]System.Console::ReadLine()

 IL_0011: pop

 IL_0012: ret

}

РСализация конструктора, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° CIL Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΎΡ‚Π½ΠΎΡΡΡ‰ΡƒΡŽΡΡ ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ (ldarg.0). Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ загруТаСтся Π² стСк Π½Π΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ пСрСмСнная, указанная Π½Π°ΠΌΠΈ, Π° ΠΊΠ°ΠΊ тСкущая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ ссылка (подробности этого процСсса Π±ΡƒΠ΄ΡƒΡ‚ описаны ΠΏΠΎΠ·ΠΆΠ΅). Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ конструктор, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, явно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ конструктор Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса.