IL-код для вызова метода без параметра - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу, чтобы ИЛ сгенерировал динамический метод

delegate ArraySegment<byte> X(MyClass mc);

, который вызывает метод подписи для mc и возвращает его параметр out.

MethodInfo methInf = aClass.GetMethod("Y",
    BindingFlags.Public | BindingFlags.Instance, 
    null, new[] { typeof(ArraySegment<byte>).MakeByRefType() }, null);

но я не знаю, как обрабатывать параметр out. Вот код, который у меня есть.

DynamicMethod dm = new DynamicMethod("X", typeof(ArraySegment<byte>),
                                     new[] { typeof(MyClass) });
ILGenerator il = dm.GetILGenerator();

il.Emit(OpCodes.Ldarg_0);
il.EmitCall(OpCodes.Callvirt, methInf, null);

Что нужно для работы нашего параметра?

1 Ответ

0 голосов
/ 13 ноября 2018

Спасибо @MarcGravell (также за ваш удаленный ответ, который очень помог, поскольку в нем разъясняется, на что вы намекаете в комментарии к моему вопросу) и ILSpy , который помог мне скомпилировать код на C # в CIL, так что я мог бы просто посмотреть на это.

Итак, вот последний рабочий код:

LocalBuilder local = il.DeclareLocal(typeof(ArraySegment<byte>));
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldloca, local);
il.EmitCall(OpCodes.Callvirt, methInf, null);
il.Emit(OpCodes.Pop);
il.Emit(OpCodes.Ldloc, local.LocalIndex);
il.Emit(OpCodes.Ret);

Вызывать это в 10 раз быстрее, чем methodInfo.Invoke(...) (конечно, для methodInfo объекта, который был создан только один раз).

...