diff --git a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyLoadErrorTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyLoadErrorTreeNode.cs
new file mode 100644
index 0000000000..97ce410a1f
--- /dev/null
+++ b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyLoadErrorTreeNode.cs
@@ -0,0 +1,27 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.Core.Presentation;
+using ICSharpCode.TreeView;
+
+namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
+{
+ public class AssemblyLoadErrorTreeNode : SharpTreeNode
+ {
+ public override object Text {
+ get {
+ return "(Assembly not loadable)";
+ }
+ }
+
+ public override object Icon {
+ get {
+ return null;
+ }
+ }
+ }
+}
+
+
diff --git a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs
index ff499c969f..3f91079d7a 100644
--- a/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs
+++ b/src/Main/Base/Project/Dom/ClassBrowser/AssemblyTreeNode.cs
@@ -36,6 +36,17 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
}
}
+ protected override void LoadChildren()
+ {
+ Children.Clear();
+ if (model.Context.IsValid) {
+ base.LoadChildren();
+ } else {
+ // This assembly could not be loaded correctly, add sub-node with error text
+ Children.Add(new AssemblyLoadErrorTreeNode());
+ }
+ }
+
public override object Text {
get {
return model.AssemblyName;
diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
index c787f8550f..91a1577bd1 100644
--- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
+++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
@@ -84,6 +84,7 @@
+
diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
index 891508f62b..0148056215 100644
--- a/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
+++ b/src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
@@ -217,44 +217,42 @@ 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);
+ if (model is IUpdateableAssemblyModel) {
+ ((IUpdateableAssemblyModel)model).Update(EmptyList.Instance, assembly.TopLevelTypeDefinitions.ToList());
+ ((IUpdateableAssemblyModel) model).AssemblyName = assembly.AssemblyName;
+ }
+ return model;
+ }
+
+ static IAssemblyModel SafelyCreateAssemblyModelFromFile(string fileName)
{
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 CreateAssemblyModelFromFile(fileName);
+ } catch (Exception) {
+ // Special 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;
- } 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);
- }
-
- // 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 unresolvedModel;
}
-
- return unresolvedModel;
}
void AppendAssemblyFileToList(string assemblyFile)
{
- IAssemblyModel assemblyModel = CreateAssemblyModelFromFile(assemblyFile);
+ IAssemblyModel assemblyModel = SafelyCreateAssemblyModelFromFile(assemblyFile);
if (assemblyModel != null) {
AssemblyList.Assemblies.Add(assemblyModel);
- } else {
- // TODO Throw exception?
-
}
}
diff --git a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs
index 7496f03f0b..3e549efa4d 100644
--- a/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs
+++ b/src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs
@@ -9,7 +9,7 @@ using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{
///
- /// Description of OpenAssemblyFromFileCommand.
+ /// OpenAssemblyFromFileCommand.
///
class OpenAssemblyFromFileCommand : SimpleCommand
{
@@ -23,14 +23,20 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
openFileDialog.CheckPathExists = true;
if (openFileDialog.ShowDialog() ?? false)
{
- classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName));
+ try {
+ classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(openFileDialog.FileName));
+ } catch (BadImageFormatException) {
+ SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(openFileDialog.FileName));
+ } catch (FileNotFoundException) {
+ SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", openFileDialog.FileName);
+ }
}
}
}
}
///
- /// Description of OpenAssemblyFromGACCommand.
+ /// OpenAssemblyFromGACCommand.
///
class OpenAssemblyFromGACCommand : SimpleCommand
{
@@ -42,7 +48,13 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
if (gacDialog.ShowDialog() ?? false)
{
foreach (string assemblyFile in gacDialog.SelectedFileNames) {
- classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(assemblyFile));
+ try {
+ classBrowser.AssemblyList.Assemblies.Add(ClassBrowserPad.CreateAssemblyModelFromFile(assemblyFile));
+ } catch (BadImageFormatException) {
+ SD.MessageService.ShowWarningFormatted("{0} is not a valid .NET assembly.", Path.GetFileName(assemblyFile));
+ } catch (FileNotFoundException) {
+ SD.MessageService.ShowWarningFormatted("{0} is not accessible or doesn't exist anymore.", assemblyFile);
+ }
}
}
}
@@ -50,7 +62,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
}
///
- /// Description of RemoveAssemblyCommand.
+ /// RemoveAssemblyCommand.
///
class RemoveAssemblyCommand : SimpleCommand
{
@@ -68,18 +80,4 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
}
}
}
-
- ///
- /// Description of RemoveAssemblyCommand.
- ///
- class ClassBrowserCollapseAllCommand : SimpleCommand
- {
- public override void Execute(object parameter)
- {
-// var classBrowser = SD.GetService() as ClassBrowserPad;
-// if (classBrowser != null) {
-// classBrowser.TreeView
-// }
- }
- }
}