.net Fody/Mono.塞西尔:在调试器中隐藏行

ws51t4hk  于 2023-03-24  发布在  .NET
关注(0)|答案(1)|浏览(91)

我正在开发一个fody插件(使用塞西尔),并在方法的开头注入一些代码。
我在这里找到一些信息:http://blogs.msdn.com/b/abhinaba/archive/2005/10/10/479016.aspx
因此,我尝试将注入指令的序列点更新为行号0xfeefee。
我使用以下代码来实现:

public static void Inject(MethodDefinition method, List<Instruction> instructions)
    {
        var methodInstructions = method.Body.Instructions;

        int index = 0;
        var sequencePoint = method.Body.Instructions
            .Where(instruction => instruction.SequencePoint != null)
            .Select(instruction => instruction.SequencePoint)
            .FirstOrDefault();

        if (method.HasBody && sequencePoint != null && sequencePoint.Document != null)
        {
            var instruction = instructions[0];
            instruction.SequencePoint = new SequencePoint(sequencePoint.Document);
            instruction.SequencePoint.StartLine = 0xfeefee;
            instruction.SequencePoint.EndLine = 0xfeefee;
        }

        foreach (var instruction in instructions)
        {
            methodInstructions.Insert(index++, instruction);
        }

        method.Body.OptimizeMacros();
    }

这应该与NullGuard.Fody项目使用的代码基本相同,但它不起作用。当尝试调试到注入代码的方法时,我仍然从Visual Studio获得源不可用信息。
我还需要做什么来更新pdb文件吗?

5m1hhzi4

5m1hhzi41#

尝试从查询中删除Where以选择第一个序列点。
如果方法的第一条指令有一个序列点,则只需要添加隐藏序列点。

相关问题