public virtual AssemblyDefinition Resolve(AssemblyNameReference name) { if (name == null) throw new ArgumentNullException ("name"); var assembly = SearchDirectory (name, m_directories); if (assembly != null) return assembly; #if !SILVERLIGHT && !CF var framework_dir = Path.GetDirectoryName (typeof(object).Module.FullyQualifiedName); if (IsZero (name.Version)) { assembly = SearchDirectory (name, new[] { framework_dir }); if (assembly != null) return assembly; } if (name.Name == "mscorlib") { assembly = GetCorlib (name); if (assembly != null) return assembly; } assembly = GetAssemblyInGac (name); if (assembly != null) return assembly; assembly = SearchDirectory (name, new[] { framework_dir }); if (assembly != null) return assembly; #endif if (ResolveFailure != null) { assembly = ResolveFailure (this, name); if (assembly != null) return assembly; } throw new FileNotFoundException (name.ToString ()); }
public static Reflector.CodeModel.IAssemblyReference Cecil2Reflector(AssemblyNameReference anr, ModuleDefinition md) { Reflector.CodeModel.IModule m = Cecil2Reflector(md); if (m == null) return null; string anrName = anr.ToString(); foreach (Reflector.CodeModel.IAssemblyReference ar in m.AssemblyReferences) { if (ar.ToString() == anrName) return ar; } return null; }
IEnumerable<Module> findModules(AssemblyNameReference assemblyRef) { var moduleHash = assemblyHash.lookup(assemblyRef.ToString()); if (moduleHash != null) return moduleHash.Modules; return null; }
/// <summary> /// Loads a dependency and adds it to Dependencies. Requires the field Dir to be set. /// </summary> /// <param name="dependency">Dependency to load.</param> public virtual void LoadDependency(AssemblyNameReference dependency) { LoadDependency(dependency.Name, dependency.ToString()); }
/// <summary> /// this is fully reentrant and multithreading capable, but will itself block. /// </summary> private AssemblyDefinition Load(AssemblyNameReference name, string assemblyFilename, ReaderParameters parameters) { AssemblyDefinition ret = null; TaskCompletionSource<AssemblyDefinition> loadingTaskSource = new TaskCompletionSource<AssemblyDefinition>(); bool nameRegistered = false, filenameRegistered = false; try { // First, make sure we are the only one loading. while (true) { Task<AssemblyDefinition> loadingTask; if (name != null && !nameRegistered) { if (loadingTasks.TryGetValue(name.Name, out loadingTask)) { ret = loadingTask.Result; return ret; } if (!loadingTasks.TryAdd(name.Name, loadingTaskSource.Task)) continue; nameRegistered = true; } if (loadingTasks.TryAdd(assemblyFilename, loadingTaskSource.Task)) { filenameRegistered = true; break; } if (loadingTasks.TryGetValue(assemblyFilename, out loadingTask)) { if (loadingTask == loadingTaskSource.Task) break; ret = loadingTask.Result; return ret; } } // now check if it has already been loaded. if (name != null) { if (referencesByName.TryGetValue(name.Name, out ret)) return ret; } ret = fileNamesByAssembly.FirstOrDefault(v => v.Value.Equals(assemblyFilename, StringComparison.InvariantCultureIgnoreCase)).Key; if (ret != null) return ret; // now load the assembly. Console.WriteLine("Loading {0}...", Path.GetFileName(assemblyFilename)); AssemblyDefinition assm = AssemblyDefinition.ReadAssembly(assemblyFilename, parameters); VerifyFrameworkAssembly(assm, assemblyFilename); // have to use a lock to update both data structures at the same time. lock (referencesByName) { // now check again by the assembly name if it has been loaded before. // This can happen if we were only provided a file name if (!referencesByName.TryAdd(assm.Name.Name, assm)) { ret = referencesByName[assm.Name.Name]; return ret; } fileNamesByAssembly[assm] = assemblyFilename; } ret = assm; // now notify any listeners. note that if we were called on multiple threads // these might be called reentrantly as well. if(assemblyLoaded != null) assemblyLoaded(ret); if (classLoader != null) classLoader.LoadAssembly(ret); // done. return ret; } catch (Exception ex) { #if DEBUG Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); #endif // Log the error var assemblyName = name==null?assemblyFilename:name.ToString(); DLog.Error(DContext.CompilerAssemblyResolver, "Failed to load assembly {0}: {1}", assemblyName, ex.Message); // Pass the error on var exn = new AssemblyResolutionException(name??new AssemblyNameDefinition(assemblyFilename, new Version())); loadingTaskSource.SetException(exn); throw exn; } finally { loadingTaskSource.TrySetResult(ret); // cleanup our registrations Task<AssemblyDefinition> ignore; if (nameRegistered) loadingTasks.TryRemove(name.Name, out ignore); if (filenameRegistered) loadingTasks.TryRemove(assemblyFilename, out ignore); } }