Browse Source

AddIn: Correctly handling projects nested in solution folders.

pull/1213/head
Andreas Weizel 8 years ago
parent
commit
ea1b953b89
  1. 3
      ILSpy.AddIn/Commands/OpenCodeItemCommand.cs
  2. 25
      ILSpy.AddIn/Commands/OpenILSpyCommand.cs

3
ILSpy.AddIn/Commands/OpenCodeItemCommand.cs

@ -87,8 +87,7 @@ namespace ICSharpCode.ILSpy.AddIn.Commands @@ -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<EnvDTE.Project>()
.FirstOrDefault(p => p.FileName == roslynProject.FilePath);
var project = FindProject(owner.DTE.Solution.Projects.OfType<EnvDTE.Project>(), roslynProject.FilePath);
if (project == null) {
owner.ShowMessage(OLEMSGICON.OLEMSGICON_WARNING, "Can't show ILSpy for this code element!");
return;

25
ILSpy.AddIn/Commands/OpenILSpyCommand.cs

@ -6,6 +6,7 @@ using System.IO; @@ -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 @@ -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 @@ -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<EnvDTE.Project>().FirstOrDefault(p => p.FileName == roslynProject.FilePath);
var project = FindProject(owner.DTE.Solution.Projects.OfType<EnvDTE.Project>(), 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 @@ -107,6 +109,25 @@ namespace ICSharpCode.ILSpy.AddIn.Commands
return dict;
}
protected EnvDTE.Project FindProject(IEnumerable<EnvDTE.Project> 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<EnvDTE.ProjectItem>().Select(pi => pi.SubProject).OfType<EnvDTE.Project>(),
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");

Loading…
Cancel
Save