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