我試圖注入一個「if(staticDebugOn)Console.WriteLine」每個調用Console.WriteLine在一組程序集之前。到目前爲止,我設法創建了「if(staticDebugOn」但是我不明白如何找到適當的行來插入指令。使用CECIL注入,如果之前Console.WriteLine
我是否需要創建和分析堆棧的CIL指令的方法IM變化,然後注入指令時,堆棧具有相同數量elememts作爲當Console.Write已beeen稱爲後
// Creating field...
TypeReference bool_type = module.Import(typeof(bool));
fiDef = new FieldDefinition("staticDebugOn",FieldAttributes.Static|FieldAttributes.Public, bool_type);
type.Fields.Add (fiDef);
// creating instructions....
var i1 = Instruction.Create(OpCodes.Ldsfld, fiDef);
var i2 = Instruction.Create(OpCodes.Brfalse, i1);
我想,如果Console.WriteLine被調用,就像一個字符串:?控制檯.WriteLine(「helloworld」);它很容易找到正確的位置,注入i1和i2的指令,必須在指令之前在棧上插入strig「helloworld」,對吧?
但是,很多情況下涉及更高級的一組指令。實際調用Console.WriteLine前
Console.WriteLine("My Int was" + myint);
或者
Console.WriteLine(GetCheckSumAsStr(somefloat+3.0f)+String.Format("{0}",(""+(myint++)));
這將在指令和值很多自然求助於被推和poppen在堆棧的頂部:考慮這段代碼。
因此,要總結的問題,任何人有一個線索,我怎麼能找出其中插入指令涉及Console.WriteLine任何情況下(無論....)
乾杯!
#if DEBUG不幫你嗎? –
我沒有使用.NET編譯器編譯它我有一些已編譯的程序集,需要使用mono CECIL重寫。 – Chris
這正是爲什麼有調試和跟蹤Writeline ... – leppie