Esempio n. 1
0
        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;
        }
Esempio n. 3
0
 IEnumerable<Module> findModules(AssemblyNameReference assemblyRef)
 {
     var moduleHash = assemblyHash.lookup(assemblyRef.ToString());
     if (moduleHash != null)
         return moduleHash.Modules;
     return null;
 }
Esempio n. 4
0
 /// <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());
 }
Esempio n. 5
0
        /// <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);
            }
        }