2011-12-05 25 views
13

Non riesco a capire come aggiungere attributo personalizzato ad un metodo che utilizza Mono.Cecil Gli attributi che vorrei aggiungere è come questo:Aggiunta di attributi personalizzati usando mono.cecil?

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

Qualcuno sa come aggiungere gli attributi personalizzati

risposta

13

In realtà è molto semplice.

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

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

Grazie mille, risolto! – method

+1

@JbEvain +1 da parte mia per aver sviluppato quella fantastica libreria. Sono iscritto al tuo feed github feed quindi conosco il lavoro che ancora si riversa passo dopo passo – sehe

+0

@sei grazie per le gentili parole! –

3

Questo è il mio introito,

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)); 

ho notato frammento di Jb Evain è leggermente diverso. Non sono sicuro che sia perché sta usando una versione più recente di Cecil o perché ho sbagliato :)

Nella mia versione di Cecil, Import restituisce un TypeReference, non il costruttore.

+2

è perché ho sbagliato :) Ho aggiornato il mio frammento di codice. Grazie. –

+0

Cheers - Sono rimasto bloccato su 0.5.0 o precedente quindi non volevo saltare alla conclusione :) – sehe

+0

Ho un'ultima domanda guyz,: ILProcessor.Append (Instruction.Create (OpCodes.Newarr,)); cosa dovrebbe essere l'operando? , Ho già aggiunto l'istruzione ldc. – method

Problemi correlati