示例#1
0
        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);
            }
        }
示例#2
0
        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());
        }
示例#3
0
        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);
        }