我正在开发一个fody插件(使用mono.cecil)并在方法的开头注入一些代码。我希望调试器跳过注入的代码。
我在这里找到了一些信息: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文件?
答案 0 :(得分:1)
尝试从查询中删除Where
以选择第一个序列点。
如果方法的第一条指令有序列点,您只需要添加隐藏的序列点。