diff --git a/ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs b/ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs index 7c8236bc6..26016a2b4 100644 --- a/ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs +++ b/ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs @@ -92,16 +92,15 @@ namespace ICSharpCode.ILSpy } } - static string GetFullPath(SharpTreeNode node) + static string GetPackageFolderPath(SharpTreeNode node) { - if (node is PackageFolderTreeNode) + string name = ""; + while (node is PackageFolderTreeNode) { - string name = node.Text + "\\"; - if (GetFullPath(node.Parent) is string parent) - return parent + "\\" + name; - return name; + name = Path.Combine(node.Text.ToString(), name); + node = node.Parent; } - return null; + return name; } internal static void Save(DockWorkspace dockWorkspace, IEnumerable nodes, string path, bool isFile) @@ -113,12 +112,12 @@ namespace ICSharpCode.ILSpy { if (node is AssemblyTreeNode { PackageEntry: { } assembly }) { - string fileName = isFile ? path : Path.Combine(path, GetFullPath(node.Parent) + WholeProjectDecompiler.SanitizeFileName(assembly.Name)); + string fileName = isFile ? path : Path.Combine(path, GetPackageFolderPath(node.Parent), assembly.Name); SaveEntry(output, assembly, fileName); } else if (node is ResourceTreeNode { Resource: PackageEntry { } resource }) { - string fileName = isFile ? path : Path.Combine(path, GetFullPath(node.Parent) + WholeProjectDecompiler.SanitizeFileName(resource.Name)); + string fileName = isFile ? path : Path.Combine(path, GetPackageFolderPath(node.Parent), resource.Name); SaveEntry(output, resource, fileName); } else if (node is PackageFolderTreeNode) @@ -128,17 +127,17 @@ namespace ICSharpCode.ILSpy { if (item is AssemblyTreeNode { PackageEntry: { } asm }) { - string fileName = Path.Combine(path, GetFullPath(item.Parent) + WholeProjectDecompiler.SanitizeFileName(asm.Name)); + string fileName = Path.Combine(path, GetPackageFolderPath(item.Parent), asm.Name); SaveEntry(output, asm, fileName); } else if (item is ResourceTreeNode { Resource: PackageEntry { } entry }) { - string fileName = Path.Combine(path, GetFullPath(item.Parent) + WholeProjectDecompiler.SanitizeFileName(entry.Name)); + string fileName = Path.Combine(path, GetPackageFolderPath(item.Parent), entry.Name); SaveEntry(output, entry, fileName); } else if (item is PackageFolderTreeNode) { - Directory.CreateDirectory(Path.Combine(path, GetFullPath(item))); + Directory.CreateDirectory(Path.Combine(path, GetPackageFolderPath(item))); } } } @@ -155,6 +154,7 @@ namespace ICSharpCode.ILSpy static void SaveEntry(ITextOutput output, PackageEntry entry, string targetFileName) { output.Write(entry.Name + ": "); + targetFileName = WholeProjectDecompiler.SanitizeFileName(targetFileName); using Stream stream = entry.TryOpenStream(); if (stream == null) { @@ -214,16 +214,12 @@ namespace ICSharpCode.ILSpy public bool IsVisible(TextViewContext context) { - if (context.SelectedTreeNodes is [AssemblyTreeNode { PackageEntry: null } asm]) + if (context.SelectedTreeNodes is [AssemblyTreeNode { LoadedAssembly.IsLoaded: true, LoadedAssembly.HasLoadError: false, PackageEntry: null } asm]) { - try - { - if (asm.LoadedAssembly.GetLoadResultAsync().GetAwaiter().GetResult().Package is { Kind: PackageKind.Bundle }) - return true; - } - catch - { - } + // Using .GetAwaiter().GetResult() is no problem here, since we already checked IsLoaded and HasLoadError. + var loadResult = asm.LoadedAssembly.GetLoadResultAsync().GetAwaiter().GetResult(); + if (loadResult.Package is { Kind: PackageKind.Bundle }) + return true; } return false; }