[Mono-list] mcs bug and Reflection.Emit shortcoming

Jeroen Frijters mono@jeroen.nu
Thu, 13 Jun 2002 17:15:53 +0200

This is a multi-part message in MIME format.

Content-Type: text/plain;
Content-Transfer-Encoding: 7bit

A simple test is attached. If you run it and disassemble foo.exe, you'll
see it calls System.Object::ToString instead of testdll::ToString.

BTW, it uses testdll.dll from the previous testcase.


> -----Original Message-----
> From: mono-list-admin@ximian.com 
> [mailto:mono-list-admin@ximian.com] On Behalf Of Paolo Molaro
> Sent: Thursday, June 13, 2002 16:33
> To: mono-list@ximian.com
> Subject: Re: [Mono-list] mcs bug and Reflection.Emit shortcoming
> On 06/13/02 Jeroen Frijters wrote:
> > I just wrote some test code on Microsoft's implementation, and their
> > implementation for Reflection.Emit doesn't use 
> MethodInfo.ReflectedType,
> > so if you change the behaviour of Mono's Reflection.Emit, 
> you won't be
> > compatible.
> Uhm, bummer. Well, I guess that should be reported to the 
> microsoft folks.
> Could you share the tests with us, so I'll make our code do 
> the correct
> thing.
> > I fear that this, along with the (bigger) issue of lack of module
> > support pretty much mean that mcs won't run on Microsoft's
> > implementation. Are there any other issues you're aware of?
> There are a couple of other limitations with the Reflection API:
> you can't know if a field or variable is volatile and you can't add
> required or optional modifiers to types. There may be some more issues
> related to the compilation of corlib.
> mcs already works around a couple of bugs in the ms reflection code
> and issues a warning in that case.
> We plan to workaround any such issues in our corlib until 
> they fix their
> stuff and issue a warning when running with their runtime. Fortunately
> the issues are fairly minor and running mcs with the mono runtime is
> faster anyway:-)
> lupus
> -- 
> -----------------------------------------------------------------
> lupus@debian.org                                     debian/rules
> lupus@ximian.com                             Monkeys do it better
> _______________________________________________
> Mono-list maillist  -  Mono-list@ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list

Content-Type: text/plain;
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;

using System;
using System.Reflection;
using System.Reflection.Emit;

public class Test
	public static void Main(string[] args)=20
		MethodInfo m =3D typeof(testdll).GetMethod("ToString");
		AssemblyName name =3D new AssemblyName();
		name.Name =3D "MyAssembly";
		AssemblyBuilder assemblyBuilder =3D =
AppDomain.CurrentDomain.DefineDynamicAssembly(name, =
		ModuleBuilder mod =3D assemblyBuilder.DefineDynamicModule("MyModule", =
		TypeBuilder b =3D mod.DefineType("MyType", TypeAttributes.Class | =
TypeAttributes.Public, typeof(testdll));
		MethodBuilder mb =3D b.DefineMethod("ToString", =
MethodAttributes.Virtual | MethodAttributes.Public, typeof(string), =
		ILGenerator ilgen =3D mb.GetILGenerator();
		ilgen.Emit(OpCodes.Call, m);
		MethodBuilder main =3D b.DefineMethod("main", MethodAttributes.Static =
| MethodAttributes.Public, typeof(void), Type.EmptyTypes);
		ilgen =3D main.GetILGenerator();
		ilgen.Emit(OpCodes.Newobj, =
                ilgen.Emit(OpCodes.Call, =
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(object) }));
		assemblyBuilder.SetEntryPoint(main, PEFileKinds.ConsoleApplication);