Как записать ilGenerator.Emit(OpcCodes.Call, handler.Method) через ILGenerator?



@daniil14056

Уже 100 вариантов перепробовал.

private static Func<int, int, int> CreateFunc3()
        {
       
            var dm = new DynamicMethod("test3", typeof(int), new Type[] { typeof(int), typeof(int) });
            Func<int,int,int> code = dm.GetILGenerator(); 
            var dSum = (int a, int b) => a + b; //  равнозначен нижниму, так же не работает
            var addOne = CreateFuncOne(); // создает другой рабочий метод из IL байт кода

            code.Emit(OpCodes.Ldarg_0);
            ode.Emit(OpCodes.Ldarg_1);
            code.Emit (OpCodes.Call, addOne.Method); // error
             //code.Emit (OpCodes.Callvirt, addOne.Method); 
             //code.EmitCall (OpCodes.Call, addOne.Method,  /* 10 комбинаций Type[]{...} */);
             //code.EmitCall (OpCodes.Callvirt, addOne.Method,/* 10 комбинаций Type[]{...} */);
            code.Emit(OpCodes.Ret);
            var func = dm.CreateDelegate<Func<int, int, int>>();
            return func;
        }

Почему не работает. А делегаты будут инлайнится, к примеру из примера выше, там локальный делегат, ссылка на него не изменится, мне только его байт код нужен,.
Как можно записать байт код метода туда? Как короче можно сделать так?

code. Write ( method.GetMethodBody().GetILAsByteArray());

Или через рефлексию достать и установить, Почему-то не могу найти поле «m_ILStream».
Как так сделать, есть ли какой-то парсер IL байткода, как быть с .GetILAsByteArray, или там можно самому написать, как-то легко, а то там 10000000 команд.

Пока писал вопрос, придумал архитектурное решение, может так надо, и не мучится?
К примеру создать класс, в котором будет массив кортежа [ OpCodes, Params ]
А так же массив «объявлений функции», которые будут хранить, индекс начала тела, из массива опкодов, и длину.
При создании функции, создается новый DynamicMethod и emit-тится регион OpCodes,
если функция должна содержать какие-то внутренние функции, то рекурсивно вставляется их регионы.
Рабочий ли способ?
Единственное что, как можно кешировать DynamicMethod, или копировать их, сбрасывая значения? Быстро инициализировать? Типа можно Пул объектов из них сделать, просто сбрасывать тело байт-кода, создавать делегат, и сбрасывать, и так по новой?


Решения вопроса 0


Ответы на вопрос 0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *