Генерация IL для 2D-массивов

Я хочу сгенерировать IL для построения двумерного массива, используя пространство имен System.Reflection.Emit.

Мой код С#

Array 2dArr  = Array.CreateInstance(typeof(int),100,100); 

Используя ildasm, я понял, что для приведенного выше кода C# создается следующий код IL.

IL_0006:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000b:  ldc.i4.s   100
IL_000d:  ldc.i4.s   100
IL_000f:  call       class [mscorlib]System.Array [mscorlib]System.Array::CreateInstance(class [mscorlib]System.Type, 
                                                                                           int32,
                                                                                           int32)

Мне удалось сгенерировать последние три оператора IL, как указано ниже.

MethodInfo createArray = typeof(Array).GetMethod("CreateInstance",
                new Type[] { typeof(Type),typeof(int),typeof(int) });
gen.Emit(OpCodes.Ldc_I4_1);
           gen.Emit(OpCodes.Ldc_I4_1);
           gen.Emit(OpCodes.Call, createArray);

Но у меня нет четкого представления о том, как сгенерировать первый оператор IL (например, IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle))

Есть ли у вас какие-либо идеи?

Кроме того, может ли кто-нибудь указать несколько хороших руководств/документов о том, как использовать пространство имен System.Reflection.Emit для генерации кодов IL?


person Upul Bandara    schedule 07.06.2011    source источник


Ответы (1)


Ах, старый добрый typeof; да, то есть:

 il.Emit(OpCodes.Ldtoken, typeof(int));
 il.EmitCall(OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"), null);

Напоминание... мой трюк, если я застреваю, всегда "скомпилируй что-то похожее и посмотри на это в отражателе".

Если вам нужны примеры, dapper-dot-net и protobuf-net выполняют приличный объем IL — первый более содержательный, ограниченный и понятный; второй - тотальный, бескомпромиссный сумасшедший IL.

Подсказки для ИЛ:

  • отслеживать стек в комментариях на КАЖДОМ шаге в правой части экрана
  • используйте краткие формы веток и т. д., но используйте их только тогда, когда знаете, что у вас очень локальная ветка
  • напишите себе небольшой набор служебных методов даже для простых вещей, таких как загрузка целого числа (что на самом деле довольно сложно, поскольку существует 12 различных способов загрузки int-32, в зависимости от значения)
person Marc Gravell    schedule 07.06.2011
comment
Большое спасибо, это действительно помогает мне - person Upul Bandara; 07.06.2011