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); }
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 }); }