/// <summary> /// This method is called by the debug engine to retrieve the current local variables. /// The result of this call will be a query containing the names of the local variables /// as well as IL code to retrieve each variable value. /// </summary> /// <param name="inspectionContext">Context of the evaluation. This contains options/flags /// to be used during compilation. It also contains the InspectionSession. The inspection /// session is the object that provides lifetime management for our objects. When the user /// steps or continues the process, the debug engine will dispose of the inspection session</param> /// <param name="instructionAddress">Instruction address or code location to use as the /// reference point for where we need to retrieve the local variables</param> /// <param name="argumentsOnly">True if only arguments are needed</param> /// <returns>A local variables query</returns> DkmCompiledClrLocalsQuery IDkmClrExpressionCompiler.GetClrLocalVariableQuery(DkmInspectionContext inspectionContext, DkmClrInstructionAddress instructionAddress, bool argumentsOnly) { var result = inspectionContext.GetClrLocalVariableQuery(instructionAddress, argumentsOnly); var newlocals = new List <DkmClrLocalVariableInfo>(); bool changed = false; foreach (var loc in result.LocalInfo) { if (loc.VariableName.Contains("$")) { // do not add changed = true; } else if (loc.VariableName == "this") { // rename var newloc = DkmClrLocalVariableInfo.Create("SELF", "SELF", loc.MethodName, loc.CompilationFlags, loc.ResultCategory, loc.CustomTypeInfo); newlocals.Add(newloc); changed = true; } else { newlocals.Add(loc); } } if (changed) { result = DkmCompiledClrLocalsQuery.Create(result.RuntimeInstance, result.DataContainer, result.LanguageId, result.Binary, result.TypeName, new ReadOnlyCollection <DkmClrLocalVariableInfo>(newlocals)); } return(result); }