public DmdExportedTypeCOMD(DmdComMetadataReader reader, uint rid, IList <DmdCustomModifier> customModifiers) : base(reader.Module, rid, customModifiers)
        {
            this.reader = reader ?? throw new ArgumentNullException(nameof(reader));
            reader.Dispatcher.VerifyAccess();

            uint token = 0x27000000 + rid;

            DmdTypeUtilities.SplitFullName(MDAPI.GetExportedTypeName(reader.MetaDataAssemblyImport, token) ?? string.Empty, out var @namespace, out var name);
            MetadataNamespace = @namespace;
            MetadataName      = name;

            MDAPI.GetExportedTypeProps(reader.MetaDataAssemblyImport, token, out var implToken, out _, out _);
            switch (implToken >> 24)
            {
            case 0x23:
                TypeScope = new DmdTypeScope(reader.ReadAssemblyName_COMThread(implToken & 0x00FFFFFF));
                break;

            case 0x26:
                var moduleName = MDAPI.GetFileName(reader.MetaDataAssemblyImport, implToken) ?? string.Empty;
                TypeScope = new DmdTypeScope(reader.GetName(), moduleName);
                break;

            case 0x27:
                TypeScope     = DmdTypeScope.Invalid;
                baseTypeToken = (int)implToken;
                break;

            default:
                TypeScope = DmdTypeScope.Invalid;
                break;
            }
        }
Example #2
0
        public DmdTypeDefCOMD(DmdComMetadataReader reader, uint rid, IList <DmdCustomModifier> customModifiers) : base(rid, customModifiers)
        {
            this.reader = reader ?? throw new ArgumentNullException(nameof(reader));
            reader.Dispatcher.VerifyAccess();
            uint token = 0x02000000 + rid;

            DmdTypeUtilities.SplitFullName(MDAPI.GetTypeDefName(reader.MetaDataImport, token) ?? string.Empty, out var @namespace, out var name);
            MetadataNamespace = @namespace;
            MetadataName      = name;
            Attributes        = FixAttributes(MDAPI.GetTypeDefAttributes(reader.MetaDataImport, token) ?? 0);
        }
Example #3
0
            public DmdTypeDef?GetTypeDef(IDmdAssemblyName?assemblyName, List <string> typeNames)
            {
                if (typeNames.Count == 0)
                {
                    return(null);
                }

                DmdModuleImpl?  targetModule   = module;
                DmdAssemblyImpl?targetAssembly = targetModule.assembly;

                if (!(assemblyName is null) && !module.assembly.AppDomainImpl.AssemblyNameEqualityComparer.Equals(targetAssembly.GetName(), assemblyName))
                {
                    targetAssembly = (DmdAssemblyImpl?)targetAssembly.AppDomain.GetAssembly(assemblyName);
                    targetModule   = (DmdModuleImpl?)targetAssembly?.ManifestModule;
                    if (targetModule is null)
                    {
                        return(null);
                    }
                }

                DmdTypeDef?type;

                DmdTypeUtilities.SplitFullName(typeNames[0], out var @namespace, out var name);

                var typeRef = new DmdParsedTypeRef(targetModule, null, DmdTypeScope.Invalid, @namespace, name, null);

                type = targetModule.GetType(typeRef, ignoreCase);

                if (type is null)
                {
                    return(null);
                }
                for (int i = 1; i < typeNames.Count; i++)
                {
                    var flags = DmdBindingFlags.Public | DmdBindingFlags.NonPublic;
                    if (ignoreCase)
                    {
                        flags |= DmdBindingFlags.IgnoreCase;
                    }
                    type = (DmdTypeDef?)type.GetNestedType(typeNames[i], flags);
                    if (type is null)
                    {
                        return(null);
                    }
                }
                return(type);
            }
Example #4
0
            public DmdTypeDef GetTypeDef(IDmdAssemblyName assemblyName, List <string> typeNames)
            {
                if (typeNames.Count == 0)
                {
                    return(null);
                }

                if (assemblyName != null && !AssemblyNameEqualityComparer.Instance.Equals(module.Assembly.GetName(), assemblyName))
                {
                    return(null);
                }

                DmdTypeDef type;

                DmdTypeUtilities.SplitFullName(typeNames[0], out string @namespace, out string name);

                var typeRef = new DmdParsedTypeRef(module, null, DmdTypeScope.Invalid, @namespace, name, null);

                type = module.GetType(typeRef, ignoreCase);

                if ((object)type == null)
                {
                    return(null);
                }
                for (int i = 1; i < typeNames.Count; i++)
                {
                    var flags = DmdBindingFlags.Public | DmdBindingFlags.NonPublic;
                    if (ignoreCase)
                    {
                        flags |= DmdBindingFlags.IgnoreCase;
                    }
                    type = (DmdTypeDef)type.GetNestedType(typeNames[i], flags);
                    if ((object)type == null)
                    {
                        return(null);
                    }
                }
                return(type);
            }
Example #5
0
        public DmdTypeRefCOMD(DmdComMetadataReader reader, uint rid, IList <DmdCustomModifier> customModifiers) : base(reader.Module, rid, customModifiers)
        {
            this.reader = reader ?? throw new ArgumentNullException(nameof(reader));
            reader.Dispatcher.VerifyAccess();
            uint token = 0x01000000 + rid;

            DmdTypeUtilities.SplitFullName(MDAPI.GetTypeRefName(reader.MetaDataImport, token) ?? string.Empty, out var @namespace, out var name);
            MetadataNamespace = @namespace;
            MetadataName      = name;

            var resScopeToken = MDAPI.GetTypeRefResolutionScope(reader.MetaDataImport, token);

            switch (resScopeToken >> 24)
            {
            case 0x00:
                TypeScope = new DmdTypeScope(reader.Module);
                break;

            case 0x01:
                TypeScope     = DmdTypeScope.Invalid;
                declTypeToken = (int)resScopeToken;
                break;

            case 0x1A:
                var moduleName = MDAPI.GetModuleRefName(reader.MetaDataImport, resScopeToken) ?? string.Empty;
                TypeScope = new DmdTypeScope(reader.GetName(), moduleName);
                break;

            case 0x23:
                TypeScope = new DmdTypeScope(reader.ReadAssemblyName_COMThread(resScopeToken & 0x00FFFFFF));
                break;

            default:
                TypeScope = DmdTypeScope.Invalid;
                break;
            }
        }
Example #6
0
 /// <summary>
 /// Finds a custom attribute
 /// </summary>
 /// <param name="attributeType">Custom attribute type</param>
 /// <param name="inherit">true to check custom attributes in all base classes</param>
 /// <returns></returns>
 public DmdCustomAttributeData FindCustomAttribute(Type attributeType, bool inherit) => CustomAttributesHelper.Find(GetCustomAttributesData(), DmdTypeUtilities.ToDmdType(attributeType, AppDomain));
Example #7
0
 /// <summary>
 /// Checks if a custom attribute is present
 /// </summary>
 /// <param name="attributeType">Custom attribute type</param>
 /// <param name="inherit">true to check custom attributes in all base classes</param>
 /// <returns></returns>
 public bool IsDefined(Type attributeType, bool inherit) => CustomAttributesHelper.IsDefined(GetCustomAttributesData(), DmdTypeUtilities.ToDmdType(attributeType, AppDomain));