@daniil14056

Mono Cesil c# Как вызвать сгенерированного метод, как создать делегат метода?

Все примеры, с сохранением в файл, кому это нужно.
Как HelloWorld запустить, без вызова другого exe файла.
Да и даже сохранить не получается, не находит основной Program класс, как такое может быть если он генирится в этом классе.

И с MethodBuilder о же самое было, если в функцию добавить поиск метода из этой сборки, то ошибка, а как исправить, не где не найти, часы листаю тонны ссылок, найти не могу, метода типа assembly. Import() , или .Using() или AddLink или что-то.

Не то что бы этот вопрос нужен ответ, но почему вот тут ошибка с DynamicBuilder
Точнее как исправить
public class DynamicMethodExample
 {
     public static void Print(int a)
     {
         Console.WriteLine($"Number {a}");
     }

     public static void Main()
     {
   
         AssemblyName assemblyName = new AssemblyName("DynamicAssembly");
         System.Reflection.Emit.AssemblyBuilder assemblyBuilder = System.Reflection.Emit.AssemblyBuilder.DefineDynamicAssembly(assemblyName, System.Reflection.Emit.AssemblyBuilderAccess.Run);

         
         var moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicModule");

         
         var typeBuilder = moduleBuilder.DefineType("DynamicType", System.Reflection.TypeAttributes.Public);

         
         var methodBuilder  = typeBuilder.DefineMethod("MyDynamicMethod",  MethodAttributes.Public |  MethodAttributes.Static, typeof(void), null);
         var methodBuilder2 = new DynamicMethod("_", null, Type.EmptyTypes);


         var ilGenerator = methodBuilder.GetILGenerator();

         // Генерируем код метода
         ilGenerator.Emit(System.Reflection.Emit.OpCodes.Ldc_I4, 42); // Загружаем число 42 на стек
         ilGenerator.Emit(System.Reflection.Emit.OpCodes.Call,
             typeof(DynamicMethodExample).GetMethod("Print",BindingFlags.Static|BindingFlags.Public, new Type[] { typeof(int) }));
         ilGenerator.Emit(System.Reflection.Emit.OpCodes.Ret); // Возвращаем значение
 
         Type dynamicType = typeBuilder.CreateType(); 
     
         object instance = Activator.CreateInstance(dynamicType);

       
         MethodInfo dynamicMethod = dynamicType.GetMethod("MyDynamicMethod");
        dynamicMethod.Invoke(instance, null);
          
     }
 }
  • Вопрос задан
  • 42 просмотра
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman Куратор тега C#
C# the best
https://learn.microsoft.com/ru-ru/dotnet/api/syste...

такая штука еще есть.

PS: У меня работает все net 6.0.

А вообще, вроде как написано на SO, то AssembyBuilder сам добавляет необходимые рефренсы в сборку.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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