Ejemplo n.º 1
0
        internal static TypeReference LoadTypeDef(Module module, int rid, bool?isValueType = null)
        {
            var image = module.Image;

            var typeRef = image.TypeSignatures[rid - 1];

            if (typeRef != null)
            {
                if (isValueType.HasValue)
                {
                    typeRef._isValueType = isValueType;
                }

                return(typeRef);
            }

            TypeDefRow row;

            image.GetTypeDef(rid, out row);

            typeRef            = new TypeReference();
            typeRef._name      = image.GetString(row.Name);
            typeRef._namespace = image.GetString(row.Namespace);

            // Owner
            int enclosingRID;

            if (image.GetEnclosingTypeByNested(rid, out enclosingRID))
            {
                typeRef._owner = LoadTypeDef(module, enclosingRID);
            }
            else
            {
                typeRef._owner = ModuleReference.LoadDef(module);
            }

            module.AddSignature(ref typeRef);
            image.TypeSignatures[rid - 1] = typeRef;

            // Is value type.
            if (isValueType.HasValue)
            {
                typeRef._isValueType = isValueType.Value;
            }
            else
            {
                int extendsToken = MetadataToken.DecompressTypeDefOrRef(row.Extends);
                if (!MetadataToken.IsNull(extendsToken))
                {
                    var baseType = TypeSignature.Load(module, extendsToken);
                    typeRef._isValueType = GetIsValueType(typeRef, baseType, module);
                }
            }

            return(typeRef);
        }
        protected void LaodBaseType()
        {
            _opFlags = _opFlags.SetBitAtIndex(LoadBaseTypeFlag, false);

            var image = _module.Image;

            int extendsToken = MetadataToken.DecompressTypeDefOrRef(image.GetTypeDefExtends(_rid));

            if (MetadataToken.IsNull(extendsToken))
            {
                return;
            }

            _baseType = TypeSignature.Load(_module, extendsToken);
        }