using System.Collections.Generic; using EnvDTE; using ICSharpCode.Decompiler.Metadata; using Microsoft.VisualStudio.Shell; namespace ICSharpCode.ILSpy.AddIn.Commands { /// /// Represents a project reference item in Solution Explorer, which can be opened in ILSpy. /// class ProjectReferenceForILSpy { ProjectItem projectItem; string fusionName; string resolvedPath; ProjectReferenceForILSpy(ProjectItem projectItem, string fusionName, string resolvedPath) { this.projectItem = projectItem; this.fusionName = fusionName; this.resolvedPath = resolvedPath; } /// /// Detects whether the given selected item represents a supported project. /// /// Data object of selected item to check. /// instance or null, if item is not a supported project. public static ProjectReferenceForILSpy Detect(object itemData) { ThreadHelper.ThrowIfNotOnUIThread(); if (itemData is ProjectItem projectItem) { var properties = Utils.GetProperties(projectItem.Properties, "FusionName", "ResolvedPath"); string fusionName = properties[0] as string; string resolvedPath = properties[1] as string; if ((fusionName != null) || (resolvedPath != null)) { return new ProjectReferenceForILSpy(projectItem, fusionName, resolvedPath); } } return null; } /// /// If possible retrieves parameters to use for launching ILSpy instance. /// /// List of current project's references. /// Parameters object or null, if not applicable. public ILSpyParameters GetILSpyParameters(Dictionary projectReferences) { ThreadHelper.ThrowIfNotOnUIThread(); string fileName = projectItem.ContainingProject?.FileName; if (!string.IsNullOrEmpty(fileName)) { if (projectReferences.TryGetValue(projectItem.Name, out DetectedReference path)) { return new ILSpyParameters(new[] { path.AssemblyFile }); } } return null; } /// /// If possible retrieves parameters to use for launching ILSpy instance. /// /// Parameters object or null, if not applicable. public ILSpyParameters GetILSpyParameters() { if (resolvedPath != null) { return new ILSpyParameters(new[] { $"{resolvedPath}" }); } else if (!string.IsNullOrWhiteSpace(fusionName)) { return new ILSpyParameters(new string[] { UniversalAssemblyResolver.GetAssemblyInGac(Decompiler.Metadata.AssemblyNameReference.Parse(fusionName)) }); } return null; } } }