private CorDebug.CorValue Dereference(CorDebug.CorValue value) { while (true) { CorDebug.CorReferenceValue rv = value.CastToReferenceValue(); if (rv == null) { break; // not a reference } if (rv.IsNull) { return(null); // reference to null } CorDebug.CorValue newValue = rv.Dereference(); if (newValue == null) { break; // couldn't dereference the reference (eg. void*) } value = newValue; } return(value); }
private string MakePtrString(CorDebug.CorValue value) { var sb = new StringBuilder(); while (true) { CorDebug.CorReferenceValue rv = value.CastToReferenceValue(); if (rv == null) { break; // not a reference } if (sb.Length > 0) { sb.Append("->"); } sb.Append("0x" + rv.Value.ToString("X", CultureInfo.CurrentUICulture)); CorDebug.CorValue newValue = null; try { newValue = rv.Dereference(); } catch (COMException ce) { if (ce.ErrorCode != (int)CorDebug.HResult.CORDBG_E_BAD_REFERENCE_VALUE) { throw; // some other error } } if (newValue == null) { break; // couldn't dereference the reference (eg. void* or invalid ref) } value = newValue; } return(sb.ToString()); }