diff --git a/ILSpy.AddIn/Commands/OpenCodeItemCommand.cs b/ILSpy.AddIn/Commands/OpenCodeItemCommand.cs index 44e034a95..a80748ce1 100644 --- a/ILSpy.AddIn/Commands/OpenCodeItemCommand.cs +++ b/ILSpy.AddIn/Commands/OpenCodeItemCommand.cs @@ -87,8 +87,7 @@ namespace ICSharpCode.ILSpy.AddIn.Commands var symbolAssemblyName = symbol.ContainingAssembly?.Identity?.Name; // Add our own project as well (not among references) - var project = owner.DTE.Solution.Projects.OfType() - .FirstOrDefault(p => p.FileName == roslynProject.FilePath); + var project = FindProject(owner.DTE.Solution.Projects.OfType(), roslynProject.FilePath); if (project == null) { owner.ShowMessage(OLEMSGICON.OLEMSGICON_WARNING, "Can't show ILSpy for this code element!"); return; diff --git a/ILSpy.AddIn/Commands/OpenILSpyCommand.cs b/ILSpy.AddIn/Commands/OpenILSpyCommand.cs index f7a431e08..9bbd1ae6f 100644 --- a/ILSpy.AddIn/Commands/OpenILSpyCommand.cs +++ b/ILSpy.AddIn/Commands/OpenILSpyCommand.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using EnvDTE80; using Microsoft.VisualStudio.Shell; using Mono.Cecil; @@ -89,8 +90,9 @@ namespace ICSharpCode.ILSpy.AddIn.Commands using (var assemblyDef = AssemblyDefinition.ReadAssembly(reference.Display)) { string assemblyName = assemblyDef.Name.Name; if (IsReferenceAssembly(assemblyDef)) { + string resolvedAssemblyFile = GacInterop.FindAssemblyInNetGac(assemblyDef.Name); dict.Add(assemblyName, - new DetectedReference(assemblyName, GacInterop.FindAssemblyInNetGac(assemblyDef.Name), false)); + new DetectedReference(assemblyName, resolvedAssemblyFile, false)); } else { dict.Add(assemblyName, new DetectedReference(assemblyName, reference.Display, false)); @@ -99,7 +101,7 @@ namespace ICSharpCode.ILSpy.AddIn.Commands } foreach (var projectReference in parentProject.ProjectReferences) { var roslynProject = owner.Workspace.CurrentSolution.GetProject(projectReference.ProjectId); - var project = owner.DTE.Solution.Projects.OfType().FirstOrDefault(p => p.FileName == roslynProject.FilePath); + var project = FindProject(owner.DTE.Solution.Projects.OfType(), roslynProject.FilePath); if (roslynProject != null && project != null) dict.Add(roslynProject.AssemblyName, new DetectedReference(roslynProject.AssemblyName, Utils.GetProjectOutputAssembly(project, roslynProject), true)); @@ -107,6 +109,25 @@ namespace ICSharpCode.ILSpy.AddIn.Commands return dict; } + protected EnvDTE.Project FindProject(IEnumerable projects, string projectFile) + { + foreach (var project in projects) { + if (project.Kind == ProjectKinds.vsProjectKindSolutionFolder) { + // This is a solution folder -> search in sub-projects + var subProject = FindProject( + project.ProjectItems.OfType().Select(pi => pi.SubProject).OfType(), + projectFile); + if (subProject != null) + return subProject; + } else { + if (project.FileName == projectFile) + return project; + } + } + + return null; + } + protected bool IsReferenceAssembly(AssemblyDefinition assemblyDef) { return assemblyDef.CustomAttributes.Any(ca => ca.AttributeType.FullName == "System.Runtime.CompilerServices.ReferenceAssemblyAttribute");