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 -// } - } - } }