コード例 #1
0
        public unsafe bool TryGetOrCreateNamedTypeForMetadata(MetadataReader metadataReader, TypeDefinitionHandle typeDefHandle, out RuntimeTypeHandle runtimeTypeHandle)
        {
            int hashCode = typeDefHandle.ComputeHashCode(metadataReader);

            IntPtr moduleHandle = ModuleList.Instance.GetModuleForMetadataReader(metadataReader);

            NativeReader typeMapReader;

            if (TryGetNativeReaderForBlob(moduleHandle, ReflectionMapBlob.TypeMap, out typeMapReader))
            {
                NativeParser    typeMapParser = new NativeParser(typeMapReader, 0);
                NativeHashtable typeHashtable = new NativeHashtable(typeMapParser);

                ExternalReferencesTable externalReferences = default(ExternalReferencesTable);
                externalReferences.InitializeCommonFixupsTable(moduleHandle);

                var          lookup = typeHashtable.Lookup(hashCode);
                NativeParser entryParser;
                while (!(entryParser = lookup.GetNext()).IsNull)
                {
                    var foundTypeIndex = entryParser.GetUnsigned();
                    if (entryParser.GetUnsigned().AsHandle().Equals(typeDefHandle))
                    {
                        runtimeTypeHandle = externalReferences.GetRuntimeTypeHandleFromIndex(foundTypeIndex);
                        return(true);
                    }
                }
            }

            runtimeTypeHandle = default(RuntimeTypeHandle);
            return(false);
        }
コード例 #2
0
            protected override NamedTypeLookupResult CreateValueFromKey(QTypeDefinition key)
            {
                RuntimeTypeHandle foundRuntimeTypeHandle = default(RuntimeTypeHandle);

                if (key.IsNativeFormatMetadataBased)
                {
                    MetadataReader       metadataReader = key.NativeFormatReader;
                    TypeDefinitionHandle typeDefHandle  = key.NativeFormatHandle;
                    int hashCode = typeDefHandle.ComputeHashCode(metadataReader);

                    NativeFormatModuleInfo module = ModuleList.Instance.GetModuleInfoForMetadataReader(metadataReader);

                    NativeReader typeMapReader;
                    if (TryGetNativeReaderForBlob(module, ReflectionMapBlob.TypeMap, out typeMapReader))
                    {
                        NativeParser    typeMapParser = new NativeParser(typeMapReader, 0);
                        NativeHashtable typeHashtable = new NativeHashtable(typeMapParser);

                        ExternalReferencesTable externalReferences = default(ExternalReferencesTable);
                        externalReferences.InitializeCommonFixupsTable(module);

                        var          lookup = typeHashtable.Lookup(hashCode);
                        NativeParser entryParser;
                        while (!(entryParser = lookup.GetNext()).IsNull)
                        {
                            var foundTypeIndex = entryParser.GetUnsigned();
                            if (entryParser.GetUnsigned().AsHandle().Equals(typeDefHandle))
                            {
                                foundRuntimeTypeHandle = externalReferences.GetRuntimeTypeHandleFromIndex(foundTypeIndex);
                                break;
                            }
                        }
                    }
                }

                return(new NamedTypeLookupResult()
                {
                    QualifiedTypeDefinition = key,
                    RuntimeTypeHandle = foundRuntimeTypeHandle,
                    VersionNumber = TypeLoaderEnvironment.Instance._namedTypeLookupLiveVersion
                });
            }