void DoResolveReferences(IProgressMonitor progressMonitor)
        {
            var          referenceItems            = project.ResolveAssemblyReferences(progressMonitor.CancellationToken);
            const double assemblyResolvingProgress = 0.3;             // 30% asm resolving, 70% asm loading

            progressMonitor.Progress += assemblyResolvingProgress;
            progressMonitor.CancellationToken.ThrowIfCancellationRequested();

            List <FileName>           assemblyFiles = new List <FileName>();
            List <IAssemblyReference> newReferences = new List <IAssemblyReference>();

            foreach (var reference in referenceItems)
            {
                ProjectReferenceProjectItem projectReference = reference as ProjectReferenceProjectItem;
                if (projectReference != null)
                {
                    newReferences.Add(projectReference);
                }
                else
                {
                    assemblyFiles.Add(reference.FileName);
                }
            }

            foreach (var file in assemblyFiles)
            {
                progressMonitor.CancellationToken.ThrowIfCancellationRequested();
                if (File.Exists(file))
                {
                    try {
                        var pc = SD.AssemblyParserService.GetAssembly(file, false, progressMonitor.CancellationToken);
                        if (pc != null)
                        {
                            newReferences.Add(pc);
                        }
                    } catch (IOException ex) {
                        LoggingService.Warn(ex);
                    } catch (BadImageFormatException ex) {
                        LoggingService.Warn(ex);
                    }
                }
                progressMonitor.Progress += (1.0 - assemblyResolvingProgress) / assemblyFiles.Count;
            }
            lock (lockObj) {
                if (!disposed)
                {
                    projectContent  = projectContent.RemoveAssemblyReferences(this.references).AddAssemblyReferences(newReferences);
                    this.references = newReferences.ToArray();
                    SD.ParserService.InvalidateCurrentSolutionSnapshot();
                    SD.MainThread.InvokeAsyncAndForget(
                        delegate {
                        assemblyModel.UpdateReferences(projectContent.AssemblyReferences.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList());
                    });
                }
            }
        }
        public IAssemblyModel GetAssemblyModel(FileName fileName, bool includeInternalMembers = false)
        {
            LoadedAssembly assembly = GetLoadedAssembly(fileName, includeInternalMembers);

            if (assembly.Model == null)
            {
                // Get references
                DefaultAssemblySearcher assemblySearcher = new DefaultAssemblySearcher(fileName);
                var referencedAssemblies = new List <IUnresolvedAssembly>();
                foreach (var referencedAssemblyName in assembly.References)
                {
                    var assemblyFileName = assemblySearcher.FindAssembly(referencedAssemblyName);
                    if (assemblyFileName != null)
                    {
                        var loadedRefAssembly = GetLoadedAssembly(assemblyFileName, includeInternalMembers);
                        if (loadedRefAssembly != null)
                        {
                            referencedAssemblies.Add(loadedRefAssembly.ProjectContent);
                        }
                    }
                }

                IEntityModelContext      context = new AssemblyEntityModelContext(assembly.ProjectContent, referencedAssemblies.ToArray());
                IUpdateableAssemblyModel model   = SD.GetService <IModelFactory>().CreateAssemblyModel(context);

                model.Update(EmptyList <IUnresolvedTypeDefinition> .Instance, assembly.ProjectContent.TopLevelTypeDefinitions.ToList());
                model.AssemblyName     = assembly.ProjectContent.AssemblyName;
                model.FullAssemblyName = assembly.ProjectContent.FullAssemblyName;
                model.UpdateReferences(assembly.References);
                assembly.Model = model;
            }

            return(assembly.Model);
        }
        static IAssemblyModel CreateAssemblyModel(Module module)
        {
            IEntityModelContext      context = new DebuggerProcessEntityModelContext(module.Process, module);
            IUpdateableAssemblyModel model   = SD.GetRequiredService <IModelFactory>().CreateAssemblyModel(context);
            var types = module.Assembly.TopLevelTypeDefinitions.SelectMany(td => td.Parts).ToList();

            model.AssemblyName     = module.UnresolvedAssembly.AssemblyName;
            model.FullAssemblyName = module.UnresolvedAssembly.FullAssemblyName;
            model.Update(EmptyList <IUnresolvedTypeDefinition> .Instance, types);
            model.UpdateReferences(module.GetReferences().Select(r => new DomAssemblyName(r)).ToArray());
            return(model);
        }