Как узнать IL на CLR
Так как эти коды IL, что я вижу больше, мне нравится учиться правильно интерпретировать их.
Я не мог найти документацию, такую как компилятор C# или любой другой, поэтому я думаю, что могу в значительной степени позаботиться об остальном после того, как я узнаю эти общие:
Ниже приведены некоторые примеры кодов IL, содержащих то, что мне нужно знать:
Пример 1:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] class EnumReflection.DerivedClass derivedClass)
IL_0000: nop
IL_0001: newobj instance void EnumReflection.DerivedClass::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance void EnumReflection.DerivedClass::WriteOutput()
IL_000d: nop
IL_000e: ret
} // end of method Program::Main
Пример 2:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 38 (0x26)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "Hello"
IL_0006: stfld string EnumReflection.DerivedClass::hello
IL_000b: ldarg.0
IL_000c: ldstr "World"
IL_0011: stfld string EnumReflection.DerivedClass::world
IL_0016: ldarg.0
IL_0017: ldc.i4.s 123
IL_0019: stfld int32 EnumReflection.DerivedClass::age
IL_001e: ldarg.0
IL_001f: call instance void EnumReflection.BaseClass::.ctor()
IL_0024: nop
IL_0025: ret
} // end of method DerivedClass::.ctor
Я знаю, что эти коды делают поскольку я их произвел: -) однако я хотел бы узнать больше о соответствующем IL-коде.
эти образцы содержат коды IL, такие как,и не могли бы вы объяснить команду вопросительными знаками? и что означает эта команда? Поэтому мы можем легко запомнить их.
- nop (для отладки - нет операции)
- newobj (кажется, он создает новый объект в куче)
- stloc.0 ?
- ldloc.Ноль ?
- рет ?
- ldarg.0 ?
- ldstr ?
- stfld ?
- ЛДЦ.и4.s ?
- .конструктор - конструктор
понимание IL важно, поскольку оно раскрывает, как конкретный компилятор производит коды и действует в конкретных случаях.
тем не менее, я не мог найти хорошие документы, которые содержат примеры, а также о IL. CLR с C# 3.0-хорошая книга, но в конечном итоге это не книга IL, поэтому она не объясняет все об иле.
EDIT:
Я нашел спецификации, и они говорят следующее: спасибо @usr.
- nop (для отладки - нет операции)
- newobj - создать новый объект
- stloc.0-значение pop из стека в локальную переменную
- ldloc.0 ? - загрузите локальную переменную в стек
- ret-return from method
- ldarg.0 - загрузить аргумент 0 на стек.
- ldstr-загрузить строку литерала
- stfld-хранить в поле объекта
- ЛДЦ.и4.S-нажмите num на стек как int32, короткая форма.
- .конструктор - конструктор
4 ответов
Microsoft стандартизировала CLR и опубликовала эти стандарты. Раздел III содержит богатую информацию о IL / CIL и подходит для обучения. Это отличный документ.
вы также можете узнать IL на примере. Скомпилируйте несколько простых методов в C# и посмотрите на IL в reflector (он имеет IL-режим).
есть несколько книг, которые охватывают IL:
- внутри Microsoft .NET IL ассемблер
- эксперт .NET 2.0 Il ассемблер
- компиляция для .NET Common Language Runtime (CLR)
- не стесняйтесь редактировать этот ответ и добавить какие-то книги.
также некоторых книги по реинжиниринг есть разделы по IL.
Смотрите также:
- nop-no-op
- newobj-создайте объект и вызовите его конструктор.
- stloc.0-Pop значение из стека, и сохранить его в первой локальной переменной
- ldloc.0-вставьте первую локальную переменную в стек
- ret-return
- ldarg.0-Нажмите первый аргумент (
this
в методах экземпляра) в стек - ldstr-вставьте строку в стек
- stfld-установить поле, используя данные стек.
- НРС.и4.S-нажмите указанное число как int.
- .конструктор - конструктор
я рекомендую вам найти хороший источник документации по этим кодам (Википедия может быть лучшей, хотя: (). Документация для системы.Отображение.Emit имеет довольно подробную документацию для opcodes.
и прежде всего, создайте небольшие программы и изучите выход IL. Это лучший способ учиться.
Если вы хотите краткий обзор каждого кода операции, вы можете сделать хуже, чем проверка System.Reflection.Emit
пространство имен.
например, есть OpCodes
класс, который имеет статическое поле для каждого кода операции. Каждый из них затем описывается более подробно, с точки зрения его поведения стека. Е. Г. Ldarg_0
:
на ldarg.0 инструкция помещает аргумент, индексированный на 0, в стек оценок. Этот ldarg.0 инструкция может использоваться для загрузки типа значения или примитивного значения в стек путем копирования его из входящего аргумента.