这个问题是关于自定义C#IL代码的静态堆栈分析以及如何设计操作码来满足编译器.
我有代码通过附加我自己的代码来修改现有的C#方法.为了避免原始方法在执行代码之前返回,它将所有RET操作码替换为BR endlabel,并将该标签添加到原始代码的末尾.然后我在那里添加更多代码,最后是RET.
这一切都很好,但某些方法失败了.这是一个简单的例子:
public static string SomeMethod(int val)
{
switch (val)
{
case 0:
return "string1".convert();
case 1:
return "string2".convert();
case 2:
return "string3".convert();
// ...
}
return "";
}
Run Code Online (Sandbox Code Playgroud)
这个IL代码表示:
.method public hidebysig static string SomeMethod(int32 val) cil managed
{
.maxstack 1
.locals val ([0] int32 num)
L_0000: ldarg.0
L_0001: stloc.0
L_0002: ldloc.0
L_0003: switch (L_002e, L_004f, L_0044, ...)
L_002c: br.s L_0091
L_002e: ldstr "string1"
L_0033: call string Foo::convert(string)
L_0038: ret
L_0039: ldstr "string2" …Run Code Online (Sandbox Code Playgroud)