[DotGNU]Re: [Mono-list] Enum declaration; Conflicts and Blame for Interoperability Problems

Jeroen Frijters jeroen@sumatra.nl
Tue, 7 Jan 2003 15:24:36 +0100


Hmm, interesting. I just tried the following (on the MS CLR):

AssemblyName name = new AssemblyName();
name.Name = "test";
AssemblyBuilder asm = AppDomain.CurrentDomain.DefineDynamicAssembly(name,
AssemblyBuilderAccess.Save);
ModuleBuilder mod = asm.DefineDynamicModule("testmodule", "test.dll");
TypeBuilder enumBldr = mod.DefineType("MyEnum", TypeAttributes.Public,
typeof(Enum));
enumBldr.DefineField("value__", typeof(int), FieldAttributes.Private |
FieldAttributes.RTSpecialName | FieldAttributes.SpecialName);
enumBldr.DefineField("foo", enumBldr, FieldAttributes.Literal |
FieldAttributes.Public).SetConstant(1);
enumBldr.CreateType();
asm.Save("test.dll");

And this seems to work.

Regards,
Jeroen

> -----Original Message-----
> From: Paolo Molaro [mailto:lupus@ximian.com] 
> Sent: Tuesday, January 07, 2003 15:10
> To: mono-list@ximian.com; developers@dotgnu.org
> Subject: [DotGNU]Re: [Mono-list] Enum declaration; Conflicts 
> and Blame for Interoperability Problems
> 
> 
> On 01/07/03 Jeroen Frijters wrote:
> > > The underlying issue, though, is that with the 
> > > Reflection.Emit API it's not possible to create enums as
> > > produced by csc. Once portable.net
> > > will implement Reflection.Emit, it'll have to support this 
> > > stuff anyway, just like the MS runtime does.
> > 
> > ... I would argue that MS's EnumBuilder.DefineLiteral is 
> broken. It would be
> > best if it allowed both using the underlying type as well 
> as the enum type,
> > but the current behavior as the only option is *not* 
> acceptable (given that
> > it is not CLS compliant).
> 
> I don't know off-hand what DefineLiteral accepts. The issue 
> is that you
> can't use EnumBuilder in all cases, so mcs doesn't use it and it
> 'constructs' the enum type by hand. The reason is that an API
> is missing (though it's documented): TypeBuilder.DefineNestedEnum().
> 
> So the process is to create a TypeBuilder and then DefineField()
> as needed. The value of the enum is set with 
> FieldBuilder.SetConstant().
> I think SetConstant() accepts values of the underlying type 
> of the enum,
> but it can't accept constants of the type itself, because that would
> imply calling CreateType() on the enum type (and hence it wouldn't be
> possible anymore to create fields in it and set their value with
> SetConstant).
> 
> lupus
> 
> -- 
> -----------------------------------------------------------------
> lupus@debian.org                                     debian/rules
> lupus@ximian.com                             Monkeys do it better
> _______________________________________________
> Developers mailing list
> Developers@dotgnu.org
> http://www.dotgnu.org/mailman/listinfo/developers
>