public object ReadTypedField(ulong obj, ClrFieldDescData fd) { Type typeToRead = null; UsefulGlobals.CorFieldTypeToType.TryGetValue(fd.FieldType, out typeToRead); if (typeToRead == typeof(object)) { UsefulGlobals.EnsureInit(this); if (fd.FieldMethodTable == UsefulGlobals.TypeToMethodTable[typeof(String)]) { return(ReadFieldValueString(obj, fd)); } else { byte[] data = ReadFieldBuffer(obj, fd, (uint)IntPtr.Size); return(SuperBitConverter.ToPointer(data)); } } else if (typeToRead != null) { byte[] data = ReadFieldBuffer(obj, fd, (uint)Marshal.SizeOf(typeToRead)); return(SuperBitConverter.Convert(data, typeToRead)); } else { byte[] data = ReadFieldBuffer(obj, fd, (uint)Marshal.SizeOf(typeToRead)); return(data); } }
public string ReadFieldValueString(ulong obj, ClrFieldDescData fd) { uint bytesRead = 0; _proc.ReadFieldValueString(obj, fd, 0, null, out bytesRead); StringBuilder sb = new StringBuilder((int)bytesRead / sizeof(char)); _proc.ReadFieldValueString(obj, fd, bytesRead, sb, out bytesRead); return(sb.ToString()); }
private byte[] ReadFieldBuffer(ulong obj, ClrFieldDescData fd, uint bufferSize) { byte[] buffer = new byte[bufferSize]; uint bytesRead = 0; GCHandle gch = GCHandle.Alloc(buffer, GCHandleType.Pinned); try { _proc.ReadFieldValueBuffer(obj, fd, bufferSize, gch.AddrOfPinnedObject(), out bytesRead); } finally { gch.Free(); } if (bytesRead > 0) { Array.Resize(ref buffer, (int)bytesRead); } return(buffer); }