Julien, this is a bug in the mono runtime, please fill a bug report to better track the progress of us fixing it.<br><br><br><div class="gmail_quote">2008/3/1 Julien De Groote &lt;<a href="mailto:timoch@gmail.com">timoch@gmail.com</a>&gt;:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi,<div><br></div><div>I am having trouble with DynamicMethod under mono. The sample program below does compile and work under <a href="http://ms.net" target="_blank">ms.net</a> runtime but it does not run under mono. I did a quick search through bugzilla but to no avail.</div>

<div><br></div><div>Does anyone know what is actually happening ?</div><div><br></div><div>Thanks for the help,</div><div>Julien</div><div><br>
</div><div>Here is what I get when I run the program under mono</div><div>--------------------------------------------------</div><div><br></div><div><div>** (Program.exe:3112): WARNING **: mono_class_from_mono_type: implement me 0x00</div>

<div><br></div><div><br></div><div>This application has requested the Runtime to terminate it in an unusual way.</div><div>Please contact the application&#39;s support team for more information.</div>
--------------------------------------------------<br></div><div><br></div><div>Here is the program :&nbsp;</div><div>---------------------------------------------------</div><div><div>using System;</div>
<div>using System.Collections.Generic;</div><div>using System.Text;</div><div>using System.Reflection.Emit;</div><div>using System.Reflection;</div><div>using System.Globalization;</div><div><br>
</div><div>namespace DynamicMethodTest {</div><div>&nbsp;&nbsp; &nbsp;class Program {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public delegate object BodyDelegate(object[] parameters);</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public static int GetInt(int i) {</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return i;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;static void Main(string[] args) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MethodInfo minfo = typeof(Program).GetMethod(&quot;GetInt&quot;);</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DynamicMethod method = new DynamicMethod(&quot;GetInt&quot;, typeof(object),</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new Type[] { typeof(object[]) }, typeof(Program).Module);</div><div><br>
</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// generate the method body</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ILGenerator generator = method.GetILGenerator();</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MethodInfo changetype = typeof(Convert).GetMethod(&quot;ChangeType&quot;, new Type[] { typeof(object), typeof(Type), typeof(IFormatProvider) });</div>

<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MethodInfo gettypefromhandle = typeof(Type).GetMethod(&quot;GetTypeFromHandle&quot;, new Type[] { typeof(RuntimeTypeHandle) });</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MethodInfo get_InvariantCulture = typeof(CultureInfo).GetMethod(&quot;get_InvariantCulture&quot;, BindingFlags.Static | BindingFlags.Public,</div>

<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;null, Type.EmptyTypes, null);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// for each parameter of the original method, load it on stack</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ParameterInfo[] parameters = minfo.GetParameters();</div><div>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i &lt; parameters.Length; i++) {</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ParameterInfo par = parameters[i];</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// load the array</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.Emit(OpCodes.Ldarg, 0);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// load the index in the array</div>

<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.Emit(OpCodes.Ldc_I4, (int)i);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// get the element at given index</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.Emit(OpCodes.Ldelem_Ref);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// convert it if necessary</div>

<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (par.ParameterType.IsPrimitive || par.ParameterType == typeof(string)) {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// load the parameter type onto stack</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.Emit(OpCodes.Ldtoken, par.ParameterType);</div>

<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.EmitCall(OpCodes.Callvirt, gettypefromhandle, null);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// load the invariant culture onto stack</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.EmitCall(OpCodes.Call, get_InvariantCulture, null);</div>

<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// call Convert.ChangeType</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.EmitCall(OpCodes.Call, changetype, null);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if necessary, unbox the value</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (par.ParameterType.IsValueType)</div>

<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.Emit(OpCodes.Unbox_Any, par.ParameterType);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.EmitCall(OpCodes.Call, minfo, null);</div>

<div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (minfo.ReturnType == typeof(void))</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.Emit(OpCodes.Ldnull);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (minfo.ReturnType.IsValueType)</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.Emit(OpCodes.Box, minfo.ReturnType);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;generator.Emit(OpCodes.Ret);</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BodyDelegate del = (BodyDelegate)method.CreateDelegate(typeof(BodyDelegate));</div>

<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.WriteLine(del(new object[] { 0 }));</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.ReadLine();</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;}</div><div>}</div><div><br></div></div><font color="#888888"><div><br>
</div><div><br>-- <br>Julien De Groote<br><a href="mailto:timoch@gmail.com" target="_blank">timoch@gmail.com</a>
</div>
</font><br>_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
<br></blockquote></div><br>