2016-02-05 21 views
1

我試圖注入一個「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任何情況下(無論....)

乾杯!

+0

#if DEBUG不幫你嗎? –

+0

我沒有使用.NET編譯器編譯它我有一些已編譯的程序集,需要使用mono CECIL重寫。 – Chris

+0

這正是爲什麼有調試和跟蹤Writeline ... – leppie

回答

1

我剛剛找到了我自己的問題的解決方案,我基本上模擬了一個堆棧,並在該堆棧的頂部推入並彈出了指令,並從指令中返回,之前我需要插入「if」,這是一個棘手的問題,複雜的問題,以啓動和運行。

0

只是一個快速的想法,但也許它會工作? (沒有塞西爾經驗)

如何添加一個新的方法,例如WriteLine2()包裝WriteLine,並將所有調用WriteLine替換爲WriteLine2?然後在WriteLine2中,你可以做你需要的檢查嗎?

相關問題