none
вызов функции c параметрами в CIL RRS feed

  • Общие обсуждения

  • как вызвать функцию с параметрами?
    Делаю так:
      
    AppDomain appDomain = Thread.GetDomain();//объектная ссылка на домен приложений
                AssemblyName assemblyName = new AssemblyName();
                assemblyName.Name = "f.exe";
                AssemblyBuilder assembly =            appDomain.DefineDynamicAssembly(assemblyName,AssemblyBuilderAccess.RunAndSave);////////
                ModuleBuilder module =
                    assembly.DefineDynamicModule("f.exe", "f.exe");
                Type[] ttt=new Type[1];
                
                ttt[0]=typeof(double);
                MethodBuilder mainMethod = module.DefineGlobalMethod("main", MethodAttributes.Static | MethodAttributes.Public, typeof(void), null);
                MethodBuilder mainMethod2 = module.DefineGlobalMethod("main2", MethodAttributes.Static | MethodAttributes.Public, typeof(void),ttt);
                MethodInfo read =
                     ((typeof(Console)).GetMethod("Read"));       
                
                ILGenerator il;
                LocalBuilder lb;
                LocalBuilder lb2;         
           
                il = mainMethod.GetILGenerator();
                lb = il.DeclareLocal(typeof(double));  
    /////////////////////////////////////////          
                il = mainMethod2.GetILGenerator(); // вызываемая
                lb2 = il.DeclareLocal(typeof(double));               
               il.Emit(OpCodes.Stloc_S, lb2);// здесь!!! ошибка будет, вроде не берёт значение из стэка
                il.Emit(OpCodes.Call, read);
                il.Emit(OpCodes.Call, read);
                il.EmitWriteLine(lb2);         
                il.Emit(OpCodes.Call, read);
                il.Emit(OpCodes.Ret);
    /////////////////////////////////////
                il = mainMethod.GetILGenerator();
                lb = il.DeclareLocal(typeof(double));
                il.EmitWriteLine("sd1");
                il.Emit(OpCodes.Call, read);
                il.Emit(OpCodes.Ldc_R8, 2.0);        
                il.Emit(OpCodes.Stloc_S,lb);
                il.EmitWriteLine(lb);        
                il.Emit(OpCodes.Ldloc_S, lb);     
                il.Emit(OpCodes.Call, mainMethod2);  //<----вызов процедуры         
                il.Emit(OpCodes.Ret); 
    //////////////////////////////////  
                module.CreateGlobalFunctions();            
                assembly.SetEntryPoint( mainMethod, PEFileKinds.ConsoleApplication);
                assembly.Save("f.exe");


    что я делаю не так?
    спасибо!
    • Изменено gizmonder 17 декабря 2009 г. 18:12 red
    • Изменен тип I.Vorontsov 2 августа 2010 г. 5:36
    • Перемещено SachinW 1 октября 2010 г. 21:27 MSDN Forums Consolidation (От:Начинающие разработчики)
    17 декабря 2009 г. 18:07

Все ответы

  • Уважаемый пользователь!

     

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме.


    Для связи [Mail]
    15 июля 2010 г. 5:24