2011-12-05 21 views
13

No puedo entender cómo añadir atributos personalizados a un método que utiliza Mono.Cecil Los atributos que me gustaría añadir es así:¿Agregar atributos personalizados usando mono.cecil?

.custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (01 00 00 00) 

¿Alguien sabe cómo agregar atributos personalizados

Respuesta

13

En realidad es muy fácil.

ModuleDefinition module = ...; 
MethodDefinition targetMethod = ...; 
MethodReference attributeConstructor = module.Import(
    typeof(DebuggerHiddenAttribute).GetConstructor(Type.EmptyTypes)); 

targetMethod.CustomAttributes.Add(new CustomAttribute(attributeConstructor)); 
module.Write(...); 
+0

¡Muchas gracias, solucionado! – method

+1

@JbEvain +1 de mí por desarrollar esa impresionante biblioteca. Estoy suscrito a su feed de cambios de github, así que sé el trabajo que todavía se vierte paso a paso – sehe

+0

@sehe gracias por las amables palabras! –

3

Esta es mi opinión,

MethodDefinition methodDefinition = ...; 
var module = methodDefinition.DeclaringType.Module; 
var attr = module.Import(typeof (System.Diagnostics.DebuggerHiddenAttribute)); 

var attrConstructor = attr.Resolve().Constructors.GetConstructor(false, new Type[] {}); 
methodDefinition.CustomAttributes.Add(new CustomAttribute(attrConstructor)); 

Noté fragmento de Jb Evain es ligeramente diferente. No estoy seguro de si eso es porque es porque está utilizando una versión más reciente de Cecil o porque estoy equivocado :)

En mi versión de Cecil Import, devuelve un TypeReference, no el constructor.

+2

es porque estaba equivocado :) He actualizado mi fragmento. Gracias. –

+0

Saludos: estaba atascado en 0.5.0 o antes, así que no saltaría a la conclusión :) – sehe

+0

Tengo una última pregunta, guyz,: ILProcessor.Append (Instruction.Create (OpCodes.Newarr,)); ¿Cuál debería ser el operando? , Ya he agregado la instrucción ldc. – method

Cuestiones relacionadas