在 Console.WriteLine 之前使用 CECIL 注入 if

本文关键字:CECIL 注入 if Console WriteLine | 更新日期: 2023-09-27 18:33:31

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

我是否需要创建和分析 im 更改的方法的 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(无论如何(的任何情况下在哪里插入指令。

干杯!

在 Console.WriteLine 之前使用 CECIL 注入 if

我刚刚找到了我自己问题的解决方案,我基本上模拟了一个堆栈,并在该堆栈的顶部推送和弹出指令,从我需要插入"如果"的指令开始计数之前,这是一个棘手而复杂的问题启动和运行。

只是一个快速的想法,但也许它会起作用?(对塞西尔没有经验(

如何添加一个新方法,例如包装WriteLine的WriteLine2((,并将所有对WriteLine的调用替换为WriteLine2?那么在 WriteLine2 中,您可以执行所需的检查吗?