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