diff --git a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs
index b6f382bba4..ff499c969f 100644
--- a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs
+++ b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs
@@ -44,7 +44,11 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public override object Icon {
get {
- return SD.ResourceService.GetImageSource("Icons.16x16.Assembly");
+ if (model.Context.IsValid) {
+ return SD.ResourceService.GetImageSource("Icons.16x16.Assembly");
+ } else {
+ return SD.ResourceService.GetImageSource("Icons.16x16.AssemblyError");
+ }
}
}
diff --git a/src/Main/Base/Project/Dom/IEntityModelContext.cs b/src/Main/Base/Project/Dom/IEntityModelContext.cs
index 69295ef7b3..542c87d107 100644
--- a/src/Main/Base/Project/Dom/IEntityModelContext.cs
+++ b/src/Main/Base/Project/Dom/IEntityModelContext.cs
@@ -44,6 +44,11 @@ namespace ICSharpCode.SharpDevelop.Dom
/// Full path and file name of the assembly. Output assembly for projects.
///
string Location { get; }
+
+ ///
+ /// Returns whether this is a valid context (based on a existing and readable definition).
+ ///
+ bool IsValid { get; }
}
public class ProjectEntityModelContext : IEntityModelContext
@@ -80,6 +85,10 @@ namespace ICSharpCode.SharpDevelop.Dom
{
return EntityModelContextUtils.IsBetterPart(part1, part2, primaryCodeFileExtension);
}
+
+ public bool IsValid {
+ get { return true; }
+ }
}
public class AssemblyEntityModelContext : IEntityModelContext
@@ -119,6 +128,10 @@ namespace ICSharpCode.SharpDevelop.Dom
public IProject Project {
get { return null; }
}
+
+ public bool IsValid {
+ get { return true; }
+ }
}
public static class EntityModelContextUtils
diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
index da5865ec00..891508f62b 100644
--- a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
+++ b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
@@ -2,13 +2,16 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
+using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Controls;
+using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem;
+using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.TreeView;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Workbench;
@@ -27,6 +30,50 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public bool IsActive { get; set; }
}
+ class UnresolvedAssemblyEntityModelContext : IEntityModelContext
+ {
+ string assemblyName;
+ string location;
+
+ public UnresolvedAssemblyEntityModelContext(string assemblyName, string location)
+ {
+ this.assemblyName = assemblyName;
+ this.location = location;
+ }
+
+ public ICompilation GetCompilation()
+ {
+ return null;
+ }
+
+ public bool IsBetterPart(IUnresolvedTypeDefinition part1, IUnresolvedTypeDefinition part2)
+ {
+ return false;
+ }
+
+ public IProject Project {
+ get {
+ return null;
+ }
+ }
+
+ public string AssemblyName {
+ get {
+ return assemblyName;
+ }
+ }
+
+ public string Location {
+ get {
+ return location;
+ }
+ }
+
+ public bool IsValid {
+ get { return false; }
+ }
+ }
+
class ClassBrowserPad : AbstractPadContent, IClassBrowser
{
#region IClassBrowser implementation
@@ -171,19 +218,33 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public static IAssemblyModel CreateAssemblyModelFromFile(string fileName)
{
- var loader = new CecilLoader();
- loader.IncludeInternalMembers = true;
- loader.LazyLoad = true;
- var assembly = loader.LoadAssemblyFile(fileName);
-
- IEntityModelContext context = new AssemblyEntityModelContext(assembly);
- IAssemblyModel model = SD.GetRequiredService().CreateAssemblyModel(context);
+ try {
+ var loader = new CecilLoader();
+ loader.IncludeInternalMembers = true;
+ loader.LazyLoad = true;
+ var assembly = loader.LoadAssemblyFile(fileName);
+
+ IEntityModelContext context = new AssemblyEntityModelContext(assembly);
+ IAssemblyModel model = SD.GetRequiredService().CreateAssemblyModel(context);
+ if (model is IUpdateableAssemblyModel) {
+ ((IUpdateableAssemblyModel)model).Update(EmptyList.Instance, assembly.TopLevelTypeDefinitions.ToList());
+ ((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName;
+ }
+ return model;
+ } catch (BadImageFormatException ex) {
+ SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(fileName));
+ } catch (FileNotFoundException ex) {
+ SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", fileName);
+ }
- if (model is IUpdateableAssemblyModel) {
- ((IUpdateableAssemblyModel)model).Update(EmptyList.Instance, assembly.TopLevelTypeDefinitions.ToList());
- ((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName;
+ // AssemblyModel for unresolved file references
+ IEntityModelContext unresolvedContext = new UnresolvedAssemblyEntityModelContext(Path.GetFileName(fileName), fileName);
+ IAssemblyModel unresolvedModel = SD.GetRequiredService().CreateAssemblyModel(unresolvedContext);
+ if (unresolvedModel is IUpdateableAssemblyModel) {
+ ((IUpdateableAssemblyModel) unresolvedModel).AssemblyName = unresolvedContext.AssemblyName;
}
- return model;
+
+ return unresolvedModel;
}
void AppendAssemblyFileToList(string assemblyFile)
diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs
index 17ce0e73f1..3287d4e4f9 100644
--- a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs
+++ b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs
@@ -23,11 +23,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
openFileDialog.CheckPathExists = true;
if (openFileDialog.ShowDialog() ?? false)
{
- try {
classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName));
- } catch (BadImageFormatException ex) {
- SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(openFileDialog.FileName));
- }
}
}
}