Yeah that works, but it's a bit convoluted. See:

var corlib = 
this.AssemblyResolver.Resolve((AssemblyNameReference)this.ModuleDefinition.TypeSystem.Corlib);
var attributeDefinition =
corlib.MainModule.GetType(typeof(CompilerGeneratedAttribute).FullName);
var constructorDefinition =
attributeDefinition.GetConstructors().First(x => x.Parameters.Count ==
0);

var constructorReference = this.ModuleDefinition.Import(constructorDefinition);

writeMethod.CustomAttributes.Add(constructorReference);

If you have the definition of your type in the corlib, you simply get
the definition of the constructor and import a reference for it.

Jb


On Mon, Jan 6, 2014 at 7:56 AM, John Galt <[email protected]> wrote:
> Thanks for the reply, Jb. This is what I ended up doing:
>
> var corlib =
> this.AssemblyResolver.Resolve((AssemblyNameReference)this.ModuleDefinition.TypeSystem.Corlib);
> var compilerGeneratedAttributeType =
> this.ModuleDefinition.Import(corlib.MainModule.GetType(typeof(CompilerGeneratedAttribute).FullName));
> var compilerGeneratedAttributeCtor =
> this.ModuleDefinition.Import(compilerGeneratedAttributeType.Resolve().GetConstructors().First(x
> => x.Parameters.Count == 0));
> writeMethod.CustomAttributes.Add(new
> CustomAttribute(compilerGeneratedAttributeCtor));
>
>
> Can you please confirm that this is the right approach? I'm trying to get my
> head around general patterns and best practices before attempting to
> abstract into helper methods.
>
> Thanks
>
> On Monday, January 6, 2014 1:26:49 AM UTC+10:30, Jb Evain wrote:
>>
>> Hey John,
>>
>> There is :)
>>
>> You can simply write:
>>
>> var constructor =
>> typeof(CompilerGeneratedAttribute).GetConstructors().First(x =>
>> x.Parameters.Count == 0)
>> var compilerGeneratedAttributeCtor = ModuleDefinition.Import(constructor);
>>
>> Note that this will create a reference to the executing version of the
>> assembly containing the type CompilerGeneratedAttribute. So if you're
>> modifying a .net 4.0 assembly on .net 4.0 that's not a problem, but if
>> you're modifying a .net 2.0 assembly when running a .net 4.0 program,
>> you will create a reference to the .net 4.0 mscorlib.
>>
>> To avoid this, it's usually best to work only with the Cecil type
>> system. You just need to resolve the reference to the corlib
>> (module.TypeSystem.Corlib), get the type CompilerGeneratedAttribute,
>> and import a reference into your current module.
>>
>> Jb
>>
>> On Sun, Jan 5, 2014 at 2:20 AM, John Galt <[email protected]> wrote:
>> > Hi,
>> >
>> > I'm new to Cecil (great job!) so am still floundering around a bit.
>> > Apologies for such a noob question.
>> >
>> > I just caught myself doing this:
>> >
>> >     var compilerGeneratedAttributeCtor =
>> >
>> > ModuleDefinition.Import(ModuleDefinition.Import(typeof(CompilerGeneratedAttribute)).Resolve().GetConstructors().First(x
>> > => x.Parameters.Count == 0));
>> >
>> > And I thought: surely there's a cleaner, easier way. Any thoughts?
>> >
>> > Thanks
>> >
>> > --
>> > --
>> > --
>> > mono-cecil
>> > ---
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "mono-cecil" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to [email protected].
>> > For more options, visit https://groups.google.com/groups/opt_out.
>
> --
> --
> --
> mono-cecil
> ---
> You received this message because you are subscribed to the Google Groups
> "mono-cecil" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.

-- 
-- 
--
mono-cecil
--- 
You received this message because you are subscribed to the Google Groups 
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to