[Mono-dev] DynamicMethod implementation
Rodrigo Kumpera
kumpera at gmail.com
Sat Mar 1 17:08:54 EST 2008
Julien, this is a bug in the mono runtime, please fill a bug report to
better track the progress of us fixing it.
2008/3/1 Julien De Groote <timoch at gmail.com>:
> Hi,
> I am having trouble with DynamicMethod under mono. The sample program
> below does compile and work under ms.net runtime but it does not run under
> mono. I did a quick search through bugzilla but to no avail.
>
> Does anyone know what is actually happening ?
>
> Thanks for the help,
> Julien
>
> Here is what I get when I run the program under mono
> --------------------------------------------------
>
> ** (Program.exe:3112): WARNING **: mono_class_from_mono_type: implement me
> 0x00
>
>
> This application has requested the Runtime to terminate it in an unusual
> way.
> Please contact the application's support team for more information.
> --------------------------------------------------
>
> Here is the program :
> ---------------------------------------------------
> using System;
> using System.Collections.Generic;
> using System.Text;
> using System.Reflection.Emit;
> using System.Reflection;
> using System.Globalization;
>
> namespace DynamicMethodTest {
> class Program {
> public delegate object BodyDelegate(object[] parameters);
>
> public static int GetInt(int i) {
> return i;
> }
>
> static void Main(string[] args) {
> MethodInfo minfo = typeof(Program).GetMethod("GetInt");
> DynamicMethod method = new DynamicMethod("GetInt",
> typeof(object),
> new Type[] { typeof(object[]) }, typeof(Program).Module);
>
> // generate the method body
> ILGenerator generator = method.GetILGenerator();
>
> MethodInfo changetype =
> typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object),
> typeof(Type), typeof(IFormatProvider) });
> MethodInfo gettypefromhandle =
> typeof(Type).GetMethod("GetTypeFromHandle", new Type[] {
> typeof(RuntimeTypeHandle) });
> MethodInfo get_InvariantCulture =
> typeof(CultureInfo).GetMethod("get_InvariantCulture", BindingFlags.Static|
> BindingFlags.Public,
> null, Type.EmptyTypes, null);
> // for each parameter of the original method, load it on stack
> ParameterInfo[] parameters = minfo.GetParameters();
> for (int i = 0; i < parameters.Length; i++) {
> ParameterInfo par = parameters[i];
> // load the array
> generator.Emit(OpCodes.Ldarg, 0);
> // load the index in the array
> generator.Emit(OpCodes.Ldc_I4, (int)i);
> // get the element at given index
> generator.Emit(OpCodes.Ldelem_Ref);
> // convert it if necessary
> if (par.ParameterType.IsPrimitive || par.ParameterType ==
> typeof(string)) {
> // load the parameter type onto stack
> generator.Emit(OpCodes.Ldtoken, par.ParameterType);
> generator.EmitCall(OpCodes.Callvirt,
> gettypefromhandle, null);
> // load the invariant culture onto stack
> generator.EmitCall(OpCodes.Call, get_InvariantCulture,
> null);
> // call Convert.ChangeType
> generator.EmitCall(OpCodes.Call, changetype, null);
> // if necessary, unbox the value
> if (par.ParameterType.IsValueType)
> generator.Emit(OpCodes.Unbox_Any,
> par.ParameterType);
> }
> }
>
> generator.EmitCall(OpCodes.Call, minfo, null);
>
> if (minfo.ReturnType == typeof(void))
> generator.Emit(OpCodes.Ldnull);
> if (minfo.ReturnType.IsValueType)
> generator.Emit(OpCodes.Box, minfo.ReturnType);
> generator.Emit(OpCodes.Ret);
>
> BodyDelegate del =
> (BodyDelegate)method.CreateDelegate(typeof(BodyDelegate));
> Console.WriteLine(del(new object[] { 0 }));
> Console.ReadLine();
> }
> }
> }
>
>
>
> --
> Julien De Groote
> timoch at gmail.com
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20080301/75f07196/attachment.html
More information about the Mono-devel-list
mailing list