Я хочу сгенерировать 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?