internal bool TryLookupGenericMethodDictionaryForComponents(GenericMethodLookupData lookupData, out IntPtr result) { if (!TryGetStaticGenericMethodDictionaryForComponents(lookupData, out result)) { if (!TryGetDynamicGenericMethodDictionaryForComponents(lookupData, out result)) { return(false); } } return(true); }
private bool TryGetStaticGenericMethodDictionaryForComponents(GenericMethodLookupData lookupData, out IntPtr result) { // Search the hashtable for a generic instantiation match int loadedModuleCount = RuntimeAugments.GetLoadedModules(null); var moduleHandles = new System.IntPtr[loadedModuleCount]; RuntimeAugments.GetLoadedModules(moduleHandles); ExternalReferencesTable externalReferencesLookup; NativeHashtable genericMethodsHashtable; foreach (IntPtr moduleHandle in moduleHandles) { if (!GetHashtableFromBlob(moduleHandle, ReflectionMapBlob.GenericMethodsHashtable, out genericMethodsHashtable, out externalReferencesLookup)) { continue; } int lookupHashcode = lookupData.LookupHashCode(); var enumerator = genericMethodsHashtable.Lookup(lookupHashcode); NativeParser entryParser; while (!(entryParser = enumerator.GetNext()).IsNull) { uint dictionaryIndex = entryParser.GetUnsigned(); if (!lookupData.MatchParsedEntry(ref entryParser, ref externalReferencesLookup, moduleHandle)) { continue; } // Current entry matched all inputs, return success result = externalReferencesLookup.GetIntPtrFromIndex(dictionaryIndex); return(true); } } result = IntPtr.Zero; return(false); }
private bool TryGetDynamicGenericMethodDictionaryForComponents(GenericMethodLookupData lookupData, out IntPtr result) { result = IntPtr.Zero; using (LockHolder.Hold(_dynamicGenericsLock)) { GenericMethodEntry entry; if (!_dynamicGenericMethods.TryGetValue(lookupData, out entry)) { return(false); } if (!entry._isRegisteredSuccessfully) { return(false); } result = entry._methodDictionary; return(true); } }