DbgDotNetRawValue?ReadField_CorDebug(DbgDotNetValueImpl obj, string fieldName) { var field = obj.Type.GetField(fieldName, DmdBindingFlags.Public | DmdBindingFlags.NonPublic | DmdBindingFlags.Instance); Debug.Assert((object)field != null); if ((object)field == null) { return(null); } var dnAppDomain = ((DbgCorDebugInternalAppDomainImpl)obj.Type.AppDomain.GetDebuggerAppDomain().InternalAppDomain).DnAppDomain; var corFieldDeclType = GetType(dnAppDomain.CorAppDomain, field.DeclaringType); var objValue = DbgCorDebugInternalRuntimeImpl.TryGetObjectOrPrimitiveValue(obj.TryGetCorValue(), out int hr); if (objValue == null) { return(null); } if (objValue.IsObject) { // This isn't a generic read-field method, so we won't try to load any classes by calling cctors. var fieldValue = objValue.GetFieldValue(corFieldDeclType.Class, (uint)field.MetadataToken, out hr); if (fieldValue == null) { return(null); } DbgDotNetValue dnValue = null; try { dnValue = CreateDotNetValue_CorDebug(fieldValue, field.AppDomain, tryCreateStrongHandle: false); return(dnValue.GetRawValue()); } finally { dnValue?.Dispose(); } } return(null); }
ILValue CreateILValueCore(DbgDotNetValue value) { if (value.Type.IsByRef) { return(new ByRefILValueImpl(this, value)); } if (value.IsNull) { return(new NullObjectRefILValueImpl(value)); } if (value.Type.IsArray) { return(new ArrayILValue(this, value)); } var rawValue = value.GetRawValue(); var objValue = rawValue.RawValue; switch (rawValue.ValueType) { case DbgSimpleValueType.Other: if (rawValue.HasRawValue && objValue == null) { return(new NullObjectRefILValueImpl(value)); } return(new TypeILValueImpl(this, value)); case DbgSimpleValueType.Decimal: case DbgSimpleValueType.DateTime: return(new TypeILValueImpl(this, value)); case DbgSimpleValueType.Void: throw new InvalidOperationException(); case DbgSimpleValueType.Boolean: return(new ConstantInt32ILValueImpl(value, (bool)objValue ? 1 : 0)); case DbgSimpleValueType.Char1: return(new ConstantInt32ILValueImpl(value, (byte)objValue)); case DbgSimpleValueType.CharUtf16: return(new ConstantInt32ILValueImpl(value, (char)objValue)); case DbgSimpleValueType.Int8: return(new ConstantInt32ILValueImpl(value, (sbyte)objValue)); case DbgSimpleValueType.Int16: return(new ConstantInt32ILValueImpl(value, (short)objValue)); case DbgSimpleValueType.Int32: return(new ConstantInt32ILValueImpl(value, (int)objValue)); case DbgSimpleValueType.Int64: return(new ConstantInt64ILValueImpl(value, (long)objValue)); case DbgSimpleValueType.UInt8: return(new ConstantInt32ILValueImpl(value, (byte)objValue)); case DbgSimpleValueType.UInt16: return(new ConstantInt32ILValueImpl(value, (ushort)objValue)); case DbgSimpleValueType.UInt32: return(new ConstantInt32ILValueImpl(value, (int)(uint)objValue)); case DbgSimpleValueType.UInt64: return(new ConstantInt64ILValueImpl(value, (long)(ulong)objValue)); case DbgSimpleValueType.Float32: return(new ConstantFloatILValueImpl(value, (float)objValue)); case DbgSimpleValueType.Float64: return(new ConstantFloatILValueImpl(value, (double)objValue)); case DbgSimpleValueType.Ptr32: if (PointerSize != 4) { throw new InvalidOperationException(); } return(ConstantNativeIntILValueImpl.Create32(value, (int)(uint)objValue)); case DbgSimpleValueType.Ptr64: if (PointerSize != 8) { throw new InvalidOperationException(); } return(ConstantNativeIntILValueImpl.Create64(value, (long)(ulong)objValue)); case DbgSimpleValueType.StringUtf16: return(new ConstantStringILValueImpl(this, value, (string)objValue)); default: Debug.Fail($"Unknown type: {rawValue.ValueType}"); throw new InvalidOperationException(); } }