2011-12-05 202 views
13

我想不出如何將自定義屬性添加到使用Mono.Cecil能 ,我想添加的屬性的方法是這樣的:使用mono.cecil添加自定義屬性?

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

有誰知道如何添加自定義屬性

回答

13

這其實很簡單。

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

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

非常感謝,解決了! – method

+1

@JbEvain +1從我開發這個真棒圖書館。我訂閱了您的github更改提要,所以我知道仍在逐步傾注的工作 – sehe

+0

@sehe感謝您的客氣話! –

3

這是我拿,

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

我注意到JB Evain的片段是略有不同。我不確定這是因爲他是使用更新版本的Cecil還是我錯了:)

在我的Cecil版本中,Import返回一個TypeReference,而不是構造函數。

+2

這是因爲我錯了:)我已經更新了我的代碼片段。謝謝。 –

+0

乾杯 - 我被困在0.5.0或更早版本,所以我不會跳到結論:) – sehe

+0

我有一個最後的問題guyz,:ILProcessor.Append(Instruction.Create(OpCodes.Newarr,));操作數應該是什麼? ,我已經添加了ldc指令。 – method