You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更新IL指令使用新局部变量索引,无需手写IL实现方法注入?

解决方案

方案1:使用成熟的代码注入框架(完全不需要接触IL)

直接用已经封装好的AOP注入工具,比如PostSharp、Fody的MethodDecorator插件,只需要通过特性声明注入规则,框架会自动处理局部变量索引重定向、IL校验等底层逻辑,不需要你做任何IL层面的操作。
你只需要指定要将Method1插入到Method2的执行位置(方法开头、返回前、异常捕获处等),框架会自动生成合法的IL代码,完全规避索引冲突问题。

方案2:基于Mono.Cecil自动修正索引(无需手动编写IL)

你之前的操作错误点在于将Method1的局部变量插入到Method2变量表的开头,会导致Method2原有变量的索引全部后移,原有逻辑的变量引用全部失效。正确的操作是将Method1的变量追加到Method2变量表的末尾,再统一修正Method1指令的变量引用索引:

// 记录Method2原有变量总数,作为Method1变量的索引偏移量
int variableOffset = Method2_MethodDefinition.Body.Variables.Count;

// 将Method1的所有局部变量追加到Method2变量表末尾
foreach (var variable in Method1_localVariables)
{
    Method2_MethodDefinition.Body.Variables.Add(variable);
}

// 遍历Method1的所有指令,修正局部变量引用的指向
foreach (var instr in Method1_Instructions)
{
    if (instr.Operand is VariableDefinition localVar)
    {
        int originIndex = Method1_localVariables.IndexOf(localVar);
        // 将指令的变量引用替换为Method2变量表中对应的新变量
        instr.Operand = Method2_MethodDefinition.Body.Variables[variableOffset + originIndex];
    }
}

// 最后将修正后的指令插入到Method2的目标位置即可

以上操作仅调整变量的插入位置和指令的操作数引用,所有IL代码均由Cecil自动生成,不需要你手动编写任何IL指令。

内容的提问来源于stack exchange,提问作者asta nigem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 19:15:02