Пример #1
0
        internal bool TryLookupGenericMethodDictionaryForComponents(GenericMethodLookupData lookupData, out IntPtr result)
        {
            if (!TryGetStaticGenericMethodDictionaryForComponents(lookupData, out result))
            {
                if (!TryGetDynamicGenericMethodDictionaryForComponents(lookupData, out result))
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }