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