protected Dictionary <string, string> GetReferences(Microsoft.CodeAnalysis.Project parentProject) { var dict = new Dictionary <string, string>(); foreach (var reference in parentProject.MetadataReferences) { using (var assemblyDef = AssemblyDefinition.ReadAssembly(reference.Display)) { if (IsReferenceAssembly(assemblyDef)) { dict.Add(assemblyDef.Name.Name, GacInterop.FindAssemblyInNetGac(assemblyDef.Name)); } else { dict.Add(assemblyDef.Name.Name, reference.Display); } } } 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); if (roslynProject != null && project != null) { dict.Add(roslynProject.AssemblyName, GetProjectOutputPath(project, roslynProject)); } } return(dict); }
protected Dictionary <string, DetectedReference> GetReferences(Microsoft.CodeAnalysis.Project parentProject) { var dict = new Dictionary <string, DetectedReference>(); foreach (var reference in parentProject.MetadataReferences) { 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, resolvedAssemblyFile, false)); } else { dict.Add(assemblyName, new DetectedReference(assemblyName, reference.Display, false)); } } } foreach (var projectReference in parentProject.ProjectReferences) { var roslynProject = owner.Workspace.CurrentSolution.GetProject(projectReference.ProjectId); 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)); } } return(dict); }
private void OpenReferenceInILSpyCallback(object sender, EventArgs e) { var explorer = ((EnvDTE80.DTE2)GetGlobalService(typeof(EnvDTE.DTE))).ToolWindows.SolutionExplorer; var items = (object[])explorer.SelectedItems; foreach (EnvDTE.UIHierarchyItem item in items) { var reference = GetReference(item.Object); if (reference == null) { ShowMessage("No reference information was found in the selection!"); continue; } string path = null; if (!string.IsNullOrEmpty(reference.PublicKeyToken)) { var token = Utils.HexStringToBytes(reference.PublicKeyToken); path = GacInterop.FindAssemblyInNetGac(new AssemblyNameReference(reference.Name, reference.Version) { PublicKeyToken = token }); } if (path == null) { path = reference.Path; } OpenAssembliesInILSpy(new[] { path }); } }
/// <summary> /// If possible retrieves parameters to use for launching ILSpy instance. /// </summary> /// <returns>Parameters object or <c>null, if not applicable.</c></returns> public ILSpyParameters GetILSpyParameters() { if (resolvedPath != null) { return(new ILSpyParameters(new[] { $"{resolvedPath}" })); } else if (!string.IsNullOrWhiteSpace(fusionName)) { return(new ILSpyParameters(new string[] { GacInterop.FindAssemblyInNetGac(Decompiler.Metadata.AssemblyNameReference.Parse(fusionName)) })); } return(null); }
protected override void OnExecute(object sender, EventArgs e) { var explorer = owner.DTE.ToolWindows.SolutionExplorer; var item = ((object[])explorer.SelectedItems).FirstOrDefault() as UIHierarchyItem; if (item == null) { return; } if (item.Object is Reference reference) { var project = reference.ContainingProject; var roslynProject = owner.Workspace.CurrentSolution.Projects.FirstOrDefault(p => p.FilePath == project.FileName); var references = GetReferences(roslynProject); if (references.TryGetValue(reference.Name, out var path)) { OpenAssembliesInILSpy(new[] { path }); } else { owner.ShowMessage("Could not find reference '{0}', please ensure the project and all references were built correctly!", reference.Name); } } else { dynamic referenceObject = item.Object; var values = GetProperties(referenceObject.Properties, "Type", "FusionName", "ResolvedPath"); if (values[0] == "Package") { values = GetProperties(referenceObject.Properties, "Name", "Version", "Path"); if (values[0] != null && values[1] != null && values[2] != null) { OpenAssembliesInILSpy(new[] { $"{values[2]}\\{values[0]}.{values[1]}.nupkg" }); return; } } else if (values[2] != null) { OpenAssembliesInILSpy(new[] { $"{values[2]}" }); return; } else if (!string.IsNullOrWhiteSpace(values[1])) { OpenAssembliesInILSpy(new string[] { GacInterop.FindAssemblyInNetGac(AssemblyNameReference.Parse(values[1])) }); return; } owner.ShowMessage("Could not find reference '{0}', please ensure the project and all references were built correctly!", referenceObject.Name); } }
/// <summary> /// This function is the callback used to execute a command when the a menu item is clicked. /// See the Initialize method to see how the menu item is associated to this function using /// the OleMenuCommandService service and the MenuCommand class. /// </summary> private void OpenInILSpyCallback(object sender, EventArgs e) { var explorer = ((EnvDTE80.DTE2)GetGlobalService(typeof(EnvDTE.DTE))).ToolWindows.SolutionExplorer; var items = (object[])explorer.SelectedItems; foreach (EnvDTE.UIHierarchyItem item in items) { dynamic reference = item.Object; string path = null; if (reference.PublicKeyToken != "") { var token = Utils.HexStringToBytes(reference.PublicKeyToken); path = GacInterop.FindAssemblyInNetGac(new AssemblyNameReference(reference.Identity, new Version(reference.Version)) { PublicKeyToken = token }); } if (path == null) { path = reference.Path; } OpenAssemblyInILSpy(path); } }
public DnSpyFile Resolve(IAssembly assembly, ModuleDef sourceModule = null, bool delayLoad = false) { FrameworkRedirect.ApplyFrameworkRedirect(ref assembly, sourceModule); if (assembly.IsContentTypeWindowsRuntime) { return(ResolveWinMD(assembly, sourceModule, delayLoad)); } // WinMD files have a reference to mscorlib but its version is always 255.255.255.255 // since mscorlib isn't really loaded. The resolver only loads exact versions, so // we must change the version or the resolve will fail. if (assembly.Name == "mscorlib" && assembly.Version == invalidMscorlibVersion) { assembly = new AssemblyNameInfo(assembly) { Version = newMscorlibVersion } } ; return(ResolveNormal(assembly, sourceModule, delayLoad)); } DnSpyFile ResolveNormal(IAssembly assembly, ModuleDef sourceModule, bool delayLoad) { var existingFile = fileList.FindAssembly(assembly); if (existingFile != null) { return(existingFile); } var file = LookupFromSearchPaths(assembly, sourceModule, true); if (file != null) { return(fileList.AddFile(file, fileList.AssemblyLoadEnabled, delayLoad)); } if (fileList.UseGAC) { var gacFile = GacInterop.FindAssemblyInNetGac(assembly); if (gacFile != null) { return(fileList.GetOrCreate(gacFile, fileList.AssemblyLoadEnabled, true, delayLoad)); } foreach (var path in GacInfo.OtherGacPaths) { file = TryLoadFromDir(assembly, true, path); if (file != null) { return(fileList.AddFile(file, fileList.AssemblyLoadEnabled, delayLoad)); } } } file = LookupFromSearchPaths(assembly, sourceModule, false); if (file != null) { return(fileList.AddFile(file, fileList.AssemblyLoadEnabled, delayLoad)); } return(null); } DnSpyFile LookupFromSearchPaths(IAssembly asmName, ModuleDef sourceModule, bool exactCheck) { DnSpyFile file; string sourceModuleDir = null; if (sourceModule != null && File.Exists(sourceModule.Location)) { sourceModuleDir = Path.GetDirectoryName(sourceModule.Location); file = TryLoadFromDir(asmName, exactCheck, sourceModuleDir); if (file != null) { return(file); } } var ary = asmSearchPathsArray; foreach (var path in ary) { file = TryLoadFromDir(asmName, exactCheck, path); if (file != null) { return(file); } } return(null); } DnSpyFile TryLoadFromDir(IAssembly asmName, bool exactCheck, string dirPath) { string baseName; try { baseName = Path.Combine(dirPath, asmName.Name); } catch (ArgumentException) { // eg. invalid chars in asmName.Name return(null); } return(TryLoadFromDir2(asmName, exactCheck, baseName + ".dll") ?? TryLoadFromDir2(asmName, exactCheck, baseName + ".exe")); } DnSpyFile TryLoadFromDir2(IAssembly asmName, bool exactCheck, string filename) { if (!File.Exists(filename)) { return(null); } DnSpyFile file = null; bool error = true; try { file = fileList.CreateDnSpyFile(filename); file.IsAutoLoaded = true; var asm = file.AssemblyDef; if (asm == null) { return(null); } bool b = exactCheck ? AssemblyNameComparer.CompareAll.Equals(asmName, asm) : AssemblyNameComparer.NameAndPublicKeyTokenOnly.Equals(asmName, asm); if (!b) { return(null); } error = false; return(file); } finally { if (error) { if (file != null) { file.Dispose(); } } } } DnSpyFile ResolveWinMD(IAssembly assembly, ModuleDef sourceModule, bool delayLoad) { var existingFile = fileList.FindAssembly(assembly); if (existingFile != null) { return(existingFile); } foreach (var winmdPath in GacInfo.WinmdPaths) { string file; try { file = Path.Combine(winmdPath, assembly.Name + ".winmd"); } catch (ArgumentException) { continue; } if (File.Exists(file)) { return(fileList.GetOrCreate(file, fileList.AssemblyLoadEnabled, true, delayLoad)); } } return(null); } }
static string FindAssemblyFromGAC(AssemblyDefinition assemblyDefinition) { return(GacInterop.FindAssemblyInNetGac(assemblyDefinition.Name)); }
static string FindAssemblyFromGAC(AssemblyDefinition assemblyDefinition) { return(GacInterop.FindAssemblyInNetGac(Decompiler.Metadata.AssemblyNameReference.Parse(assemblyDefinition.Name.FullName))); }