在Console.WriteLine之前使用CECIL注入

时间:2016-02-05 11:19:56

标签: c# .net mono .net-assembly mono.cecil

我试图注入" if(staticDebugOn)Console.WriteLine"每次调用一组程序集中的Console.WriteLine之前。到目前为止,我设法创建了" if(staticDebugOn"然而我不明白如何找到插入指令的正确行。

我是否需要创建和分析正在更改的方法的CIL指令堆栈,然后在堆栈具有与调用Console.Write之后相同数量的元素时注入指令?

// 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只是一个字符串,如:Console.WriteLine(" helloworld");它很容易找到正确的位置与注入i1和i2的说明。必须在插入strig" helloworld"的指令之前在堆栈上,对吗?

但是,很多案例涉及更高级的指令集。考虑一下这段代码:

Console.WriteLine( "My Int was" + myint );

Console.WriteLine( GetCheckSumAsStr(somefloat+3.0f)+String.Format("{0}",(""+(myint++)) );

在实际调用Console.WriteLine之前,自然会在堆栈顶部推送和弹出很多指令和值。

所以总结一下这个问题,任何人都知道如何在任何涉及Console.WriteLine(无论......)的情况下找出插入指令的位置

干杯!

2 个答案:

答案 0 :(得分:1)

我刚刚找到了自己问题的解决方案,我基本上模拟了一个堆栈,并在该堆栈顶部推送和弹出指令,从我需要插入“if”之前的指令中倒数,这是一个棘手而复杂的起床和跑步的问题。

答案 1 :(得分:0)

只是一个快速的想法但也许它会起作用? (不是塞西尔的经历)

如何添加新方法,例如WriteLine2()包装WriteLine,并将WriteLine的所有调用替换为WriteLine2?然后在WriteLine2中,您可以进行所需的检查吗?