예제 #1
0
        public static MethodDefinition ResolveMethod(TypeReference parentTypeRef, string methodName, Type[] parameterTypes)
        {
            if (parentTypeRef == null)
            {
                throw new ArgumentNullException("parentTypeRef");
            }

            if (string.IsNullOrEmpty(methodName))
            {
                throw new ArgumentNullException("methodName");
            }

            // Lookup in cache
            string cacheKey = CreateMethodCacheKey(methodName, parameterTypes, parentTypeRef.FullName, parentTypeRef.Scope.Name);

            MethodDefinition md;

            // Lookup in cache.
            if (_methodsCache.TryGetValue(cacheKey, out md))
            {
                return(md);
            }

            // locally declared type
            TypeDefinition parentType = parentTypeRef.Module.Types[parentTypeRef.FullName];

            if (parentType == null && parentTypeRef.Scope != null)
            {
                foreach (AssemblyNameReference assembly in parentTypeRef.Module.AssemblyReferences)
                {
                    if (parentTypeRef.Scope.Name == assembly.Name)
                    {
                        // First check if the assembly resolver exists.
                        if (_resolver == null)
                        {
                            _resolver = new StarLightAssemblyResolver(BinFolder);
                        }
                        AssemblyDefinition ad = _resolver.Resolve(assembly);
                        if (ad == null)
                        {
                            return(null);
                        }

                        parentType = ad.MainModule.Types[parentTypeRef.FullName];

                        break;
                    }
                }
            }

            md = parentType.Methods.GetMethod(methodName, parameterTypes);

            // Add to the cache
            _methodsCache.Add(cacheKey, md);

            return(md);
        }
예제 #2
0
        public static MethodReference ResolveMethod(string methodName, Type[] parameters, string typeName, string assemblyName, string assemblyFile)
        {
            if (string.IsNullOrEmpty(methodName))
            {
                throw new ArgumentNullException("methodName");
            }

            if (string.IsNullOrEmpty(typeName))
            {
                throw new ArgumentNullException("typeName");
            }

            if (string.IsNullOrEmpty(assemblyName))
            {
                throw new ArgumentNullException("assemblyName");
            }

            // If in cache, retrieve
            string cacheKey = CreateMethodCacheKey(methodName, parameters, typeName, assemblyName);

            MethodDefinition md;

            // Lookup in cache.
            if (_methodsCache.TryGetValue(cacheKey, out md))
            {
                return((MethodReference)md);
            }

            // Not in the cache, so get from the assembly and store in cache.

            // First check if the assembly resolver exists.
            if (_resolver == null)
            {
                _resolver = new StarLightAssemblyResolver(Path.GetDirectoryName(assemblyFile));
            }
            AssemblyDefinition asmDef = _resolver.Resolve(assemblyName);

            if (asmDef == null)
            {
                // Try to read directly using assemblyFilename
                if (!String.IsNullOrEmpty(assemblyFile))
                {
                    asmDef = AssemblyFactory.GetAssembly(assemblyFile);
                }
            }

            if (asmDef == null)
            {
                return(null);
            }

            TypeDefinition td = asmDef.MainModule.Types[typeName];

            if (td == null)
            {
                return(null);
            }

            MethodDefinition[] mds;
            if (parameters == null)
            {
                mds = td.Methods.GetMethod(methodName);

                if (mds.Length > 0)
                {
                    md = mds[0];
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                md = td.Methods.GetMethod(methodName, parameters);
                if (md == null)
                {
                    return(null);
                }
            }

            // Add to the cache
            _methodsCache.Add(cacheKey, md);

            return((MethodReference)md);
        }
예제 #3
0
        public static TypeReference ResolveType(string typeName, string assemblyName, string assemblyFile)
        {
            if (string.IsNullOrEmpty(typeName))
            {
                throw new ArgumentNullException("typeName");
            }

            if (string.IsNullOrEmpty(assemblyName))
            {
                throw new ArgumentNullException("assemblyName");
            }

            // Get the cachekey
            String cacheKey = CreateTypeCacheKey(typeName, assemblyName);

            TypeDefinition td;

            // Lookup in cache.
            if (_typesCache.TryGetValue(cacheKey, out td))
            {
                return((TypeReference)td);
            }


            if (_resolver == null)
            {
                if (String.IsNullOrEmpty(assemblyFile))
                {
                    _resolver = new StarLightAssemblyResolver(BinFolder);
                }
                else
                {
                    _resolver = new StarLightAssemblyResolver(System.IO.Path.GetDirectoryName(assemblyFile));
                }
            }

            AssemblyDefinition asmDef = _resolver.Resolve(assemblyName);

            if (asmDef == null)
            {
                // Try to read directly using assemblyFilename
                if (!String.IsNullOrEmpty(assemblyFile))
                {
                    asmDef = AssemblyFactory.GetAssembly(assemblyFile);
                }
            }
            if (asmDef == null)
            {
                return(null);
            }

            td = asmDef.MainModule.Types[typeName];

            if (td == null)
            {
                return(null);
            }

            _typesCache.Add(cacheKey, td);

            return((TypeReference)td);
        }