Ejemplo n.º 1
0
        DbgDotNetRawValue?ReadField_CorDebug(DbgDotNetValueImpl obj, string fieldName1, string?fieldName2)
        {
            const DmdBindingFlags fieldFlags = DmdBindingFlags.Public | DmdBindingFlags.NonPublic | DmdBindingFlags.Instance;
            var field = obj.Type.GetField(fieldName1, fieldFlags);

            if (field is null && !(fieldName2 is null))
            {
                field = obj.Type.GetField(fieldName2, fieldFlags);
            }
            Debug2.Assert(!(field is null));
            if (field is 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 is 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 is null)
                {
                    return(null);
                }
                DbgDotNetValue?dnValue = null;
                try {
                    dnValue = CreateDotNetValue_CorDebug(fieldValue, field.AppDomain, tryCreateStrongHandle: false);
                    return(dnValue.GetRawValue());
                }
                finally {
                    dnValue?.Dispose();
                }
            }
            return(null);
        }
 public CorDebugValueConverterImpl(DbgCorDebugInternalRuntimeImpl runtime) =>
 this.runtime = runtime ?? throw new ArgumentNullException(nameof(runtime));