@daniil14056

IL генерация кода. Как загрузить в локальную переменную, константную ссылку на объект?

Как загрузить значения объект в локальную переменную?
Вот можно устанавливать Int32 константы, а как объекты и структуры и адреса так же установить.
Есть еще опкод LdStr который на стек строку(Объект) кладет, а как готовый объект положить или ссылку или адрес.
Вот например тут в коде, создается объект new Random() каждый раз,
Как исправить, как можно сохранить как локальную переменную, ссылку или указатель, или сам объект на объект Random rand;

Предположим какой-то такой код, хочу понять как константы раставить, что бы не передавать в параметрах их
void remTest(){ref  Random rand){  // предположим Random struct
            var il = dm.GetILGenerator();
            il.DeclareLocal(typeof(int));
            il.DeclareLocal(typeof(int));
            il.Emit(OpCodes.Ldc_I4, 100); // вот можно константу значение сделать, 
          // а как сделать константу объект. 
         
            il.Emit(OpCodes.Stloc_0);
            il.Emit(OpCodes.Newobj, typeof(Random).GetConstructor(Type.EmptyTypes));
            il.Emit(OpCodes.Callvirt, typeof(Random).GetMethod("Next", Type.EmptyTypes));
            il.Emit(OpCodes.Stloc_1); 
            il.Emit(OpCodes.Ldloc_1);
            il.Emit(OpCodes.Ldloc_0);
            il.Emit(OpCodes.Rem);  
            il.Emit(OpCodes.Stsfld, typeof(main).GetField("Res" )); 
            il.Emit(OpCodes.Ret);
///....
  ///   вот так выглядит код функция  для которой код выше. .  
///как избавиться от new Random(), и при создании ссылку на 1 объект(
///код <b>осмыслять</b> не нужно, типа  искать поле Random.Shared, или какое-либо поле)
void ____f(){
         int a=100;
         int b;
         b=new Random().Next();  
         Program.Res=a%b;
}


// вот такой должен быть итоговый код функции, как его составить?
void ____f(){ 
         int a=100;
         nuint address=address; 
         b=((Random*)address).Next();  // вместо рандома другая структура будет, 
         Program.Res=a%b;
} 
Action _create____f(Random rand){    где-то тут при создании address=Unsafe.AsPointer<Random>(ref rand);  .....        }
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Во-первых, рекомендую заюзать GrEmit - отличная либа для работы с ассемблером .Net.
А во-вторых, есть такая замечательная штука под названием "дизассемблер": ildasm. Пишите обычный код на C#, разбираете его дизассемблером и смотрите что, куда и как, а потом уже пишите свой код аналогично.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы