diff --git a/Directory.Packages.props b/Directory.Packages.props
index 5766bdb926..3784f06077 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -39,12 +39,14 @@
+
+
@@ -58,4 +60,4 @@
-
\ No newline at end of file
+
diff --git a/ICSharpCode.Decompiler/Solution/SolutionCreator.cs b/ICSharpCode.Decompiler/Solution/SolutionCreator.cs
index 4ff2f25052..0021be63df 100644
--- a/ICSharpCode.Decompiler/Solution/SolutionCreator.cs
+++ b/ICSharpCode.Decompiler/Solution/SolutionCreator.cs
@@ -161,32 +161,40 @@ static void FixAllProjectReferences(List projects)
foreach (var project in projects)
{
- XDocument projectDoc = XDocument.Load(project.FilePath);
-
- if (projectDoc.Root?.Name.LocalName != "Project")
+ try
{
- throw new InvalidOperationException(
- $"The file {project.FilePath} is not a valid project file, " +
- $"no at the root; could not fix project references.");
- }
+ XDocument projectDoc = XDocument.Load(project.FilePath);
+
+ if (projectDoc.Root?.Name.LocalName != "Project")
+ {
+ throw new InvalidOperationException(
+ $"The file {project.FilePath} is not a valid project file, " +
+ $"no at the root; could not fix project references.");
+ }
- // sdk style projects don't use a namespace for the elements,
- // but we still need to use the namespace for non-sdk style projects.
- var sdkStyle = projectDoc.Root.Attribute("Sdk") != null;
- var itemGroupTagName = sdkStyle ? "ItemGroup" : NonSDKProjectFileNamespace + "ItemGroup";
- var referenceTagName = sdkStyle ? "Reference" : NonSDKProjectFileNamespace + "Reference";
+ // sdk style projects don't use a namespace for the elements,
+ // but we still need to use the namespace for non-sdk style projects.
+ var sdkStyle = projectDoc.Root.Attribute("Sdk") != null;
+ var itemGroupTagName = sdkStyle ? "ItemGroup" : NonSDKProjectFileNamespace + "ItemGroup";
+ var referenceTagName = sdkStyle ? "Reference" : NonSDKProjectFileNamespace + "Reference";
- var referencesItemGroups = projectDoc.Root
- .Elements(itemGroupTagName)
- .Where(e => e.Elements(referenceTagName).Any())
- .ToList();
+ var referencesItemGroups = projectDoc.Root
+ .Elements(itemGroupTagName)
+ .Where(e => e.Elements(referenceTagName).Any())
+ .ToList();
- foreach (var itemGroup in referencesItemGroups)
+ foreach (var itemGroup in referencesItemGroups)
+ {
+ FixProjectReferences(project.FilePath, itemGroup, projectsMap, sdkStyle);
+ }
+
+ projectDoc.Save(project.FilePath);
+ }
+ catch (Exception ex)
{
- FixProjectReferences(project.FilePath, itemGroup, projectsMap, sdkStyle);
+ throw new Exception(
+ $"Failed to fix project references in {project.FilePath}.", ex);
}
-
- projectDoc.Save(project.FilePath);
}
}
diff --git a/ICSharpCode.ILSpyCmd/ICSharpCode.ILSpyCmd.csproj b/ICSharpCode.ILSpyCmd/ICSharpCode.ILSpyCmd.csproj
index e7389be693..8dba22eaf0 100644
--- a/ICSharpCode.ILSpyCmd/ICSharpCode.ILSpyCmd.csproj
+++ b/ICSharpCode.ILSpyCmd/ICSharpCode.ILSpyCmd.csproj
@@ -63,6 +63,8 @@
+
+
@@ -70,5 +72,9 @@
-
+
+
+ true
+ 1
+
diff --git a/ICSharpCode.ILSpyCmd/IlspyCmdProgram.cs b/ICSharpCode.ILSpyCmd/IlspyCmdProgram.cs
index 29ff77b6e5..8dc1a90b94 100644
--- a/ICSharpCode.ILSpyCmd/IlspyCmdProgram.cs
+++ b/ICSharpCode.ILSpyCmd/IlspyCmdProgram.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
@@ -8,6 +9,7 @@
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Threading;
+using System.Threading.Channels;
using System.Threading.Tasks;
using ICSharpCode.Decompiler;
@@ -25,6 +27,8 @@
using Microsoft.Extensions.Hosting;
+using Spectre.Console;
+
// ReSharper disable UnassignedGetOnlyAutoProperty
namespace ICSharpCode.ILSpyCmd
@@ -45,6 +49,11 @@ Decompile assembly to destination directory (single C# file).
Decompile assembly to destination directory, create a project file, one source file per type.
ilspycmd -p -o c:\decompiled sample.dll
+ Decompile multiple assemblies into a single solution, using all available cores.
+ ilspycmd -p -o c:\decompiled -j 0 sample.dll sample2.dll sample3.dll sample4.dll
+ (or with max of 4 parallel jobs)
+ ilspycmd -p -o c:\decompiled -j 4 s1.dll s2.dll s3.dll s4.dll s5.dll s6.dll s7.dll s8.dll
+
Decompile assembly to destination directory, create a project file, one source file per type,
into nicely nested directories.
ilspycmd --nested-directories -p -o c:\decompiled sample.dll
@@ -90,6 +99,12 @@ public static Task Main(string[] args)
CommandOptionType.NoValue)]
public bool CreateCompilableProjectFlag { get; }
+ [Option("-j|--jobs",
+ "Sets the maximum number of parallel jobs for project decompilation. " +
+ "Pass 0 to use Environment.ProcessorCount (the logical processor count sans cpus not available to this process).",
+ CommandOptionType.SingleValue)]
+ public int Jobs { get; } = 1;
+
[Option("-t|--type ",
"The fully qualified name of the type to decompile.",
CommandOptionType.SingleValue)]
@@ -115,8 +130,7 @@ public static Task Main(string[] args)
public (bool IsSet, string Value) InputPDBFile { get; }
[Option("-l|--list ",
- "Lists all entities of the specified type(s). " +
- "Valid types: c(lass), i(nterface), s(truct), d(elegate), e(num)",
+ "Lists all entities of the specified type(s). Valid types: c(lass), i(nterface), s(truct), d(elegate), e(num)",
CommandOptionType.MultipleValue)]
public string[] EntityTypes { get; } = [];
@@ -163,7 +177,6 @@ public static Task Main(string[] args)
"If using ilspycmd in a tight loop or fully automated scenario, you might want to disable the automatic update check.",
CommandOptionType.NoValue)]
public bool DisableUpdateCheck { get; }
-
#region MermaidDiagrammer options
// reused or quoted commands
@@ -284,8 +297,7 @@ async Task RunAsync(CommandLineApplication app, string outputDirectory, Tex
DecompileAsProject(InputAssemblyNames[0], outputDirectory, GetSettings(), ReferencePaths, InputPDBFile);
return 0;
}
-
- DecompileAsSolution(outputDirectory, InputAssemblyNames, GetSettings(), ReferencePaths, InputPDBFile);
+ await DecompileAsSolutionAsync(outputDirectory, InputAssemblyNames, GetSettings(), ReferencePaths, InputPDBFile, Jobs);
}
else if (GenerateDiagrammer)
{
@@ -401,7 +413,7 @@ DecompilerSettings GetSettings()
ThrowOnAssemblyResolveErrors = false,
RemoveDeadCode = RemoveDeadCode,
RemoveDeadStores = RemoveDeadStores,
- UseSdkStyleProjectFormat = true,
+ UseSdkStyleProjectFormat = true, // default to sdk style, but this gets set elsewhere (based on the module being decompiled)
UseNestedDirectoriesForNamespaces = NestedDirectories,
};
}
@@ -451,7 +463,11 @@ DecompilerSettings GetSettings()
return decompilerSettings;
}
- static CSharpDecompiler GetDecompiler(DecompilerSettings settings, string assemblyFileName, string[] referencePaths, (bool IsSet, string Value) inputPDBFile)
+ static CSharpDecompiler GetDecompiler(
+ DecompilerSettings settings,
+ string assemblyFileName,
+ string[] referencePaths,
+ (bool IsSet, string Value) inputPDBFile)
{
var module = new PEFile(assemblyFileName);
var resolver = new UniversalAssemblyResolver(
@@ -463,6 +479,9 @@ static CSharpDecompiler GetDecompiler(DecompilerSettings settings, string assemb
resolver.AddSearchDirectory(path);
}
+ // we need to configure the settings using the module
+ // each decompiler instance getting its own settings clone
+ // means that we can ignore the settings object's thread-safety
settings.UseSdkStyleProjectFormat = WholeProjectDecompiler.CanUseSdkStyleProjectFormat(module);
return new CSharpDecompiler(assemblyFileName, resolver, settings) {
DebugInfoProvider = TryLoadPDB(module, inputPDBFile),
@@ -494,40 +513,175 @@ int ShowIL(string assemblyFileName, TextWriter output)
DebugInfo = TryLoadPDB(module, InputPDBFile),
ShowSequencePoints = ShowILSequencePointsFlag,
};
+
disassembler.WriteModuleContents(module);
return 0;
}
- static void DecompileAsSolution(string outputDirectory, string[] inputAssemblyNames, DecompilerSettings settings, string[] referencePaths,
- (bool IsSet, string Value) inputPDBFile)
+ static async Task DecompileAsSolutionAsync(
+ string outputDirectory,
+ string[] inputAssemblyNames,
+ DecompilerSettings settings,
+ string[] referencePaths,
+ (bool IsSet, string Value) inputPDBFile,
+ int maxDegreeOfParallelism)
{
- var projects = new List();
- foreach (var file in inputAssemblyNames)
- {
- string projectFileName = Path.Combine(
- outputDirectory,
- Path.GetFileNameWithoutExtension(file),
- Path.GetFileNameWithoutExtension(file) + ".csproj");
- Directory.CreateDirectory(Path.GetDirectoryName(projectFileName)!);
- ProjectId projectId = DecompileAsProject(
- file,
- projectFileName,
- settings,
- referencePaths,
- inputPDBFile);
- projects.Add(new ProjectItem(
- projectFileName,
- projectId.PlatformName,
- projectId.Guid,
- projectId.TypeGuid));
- }
-
- SolutionCreator.WriteSolutionFile(
- Path.Combine(outputDirectory, Path.GetFileNameWithoutExtension(outputDirectory) + ".sln"),
- projects);
+ var projects = new ConcurrentBag();
+ maxDegreeOfParallelism = maxDegreeOfParallelism <= 0 ? Environment.ProcessorCount : maxDegreeOfParallelism;
+ var progressDisplay = AnsiConsole
+ .Progress()
+ .AutoRefresh(true)
+ .AutoClear(false)
+ .HideCompleted(inputAssemblyNames.Length > 40) // could be way too many tasks to show all, 40 seems like a reasonable cutoff
+ .Columns(
+ new TaskDescriptionColumn(),
+ new ProgressBarColumn(),
+ new PercentageColumn(),
+ new SpinnerColumn(),
+ new ElapsedTimeColumn());
+ await progressDisplay.StartAsync(async ctx => {
+ ctx.Refresh();
+ // one main task to show the overall progress
+ var projectTrackingTask = ctx.AddTask("Overall Project Progress",
+ new ProgressTaskSettings { AutoStart = false, MaxValue = inputAssemblyNames.Length });
+ projectTrackingTask.StartTask();
+ // pre-generate the tasks for deterministic order
+ var taskPairs = inputAssemblyNames.Select(name => {
+ var task = ctx.AddTask(name, new ProgressTaskSettings {
+ AutoStart = false,
+ });
+ task.IsIndeterminate = true;
+ return (
+ name,
+ task,
+ settings,
+ referencePaths,
+ inputPDBFile,
+ projects,
+ outputDirectory,
+ projectTrackingTask
+ );
+ }).ToList();
+ await Parallel.ForEachAsync(
+ taskPairs,
+ new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism },
+ async (projectContext, token) => {
+ var progress = new Progress(value => {
+ // this callback must be thread-safe, as it will be called from the threadpool
+ // (or whatever SynchronizationContext is in play)
+ //
+ // so we must lock an object to ensure this callback is serialized
+ // the task object is a fine object to lock on
+ var task = projectContext.task;
+ lock (task)
+ {
+ // we can avoid the task object doing wasteful locking
+ // (which doesn't matter a lot, but this callback can get called a lot)
+ if (value.TotalUnits <= 0)
+ {
+ if (!task.IsIndeterminate) // avoid lock
+ {
+ task.IsIndeterminate = true;
+ }
+ }
+ else
+ {
+ var fractionDoneBefore = task.MaxValue == 0 ? 0 : task.Value / task.MaxValue;
+ double? _fractionDoneNow = value.TotalUnits == 0 ? null : (double)value.UnitsCompleted / value.TotalUnits;
+ var fractionDoneNow = _fractionDoneNow.Value;
+ // clamp to 0-1 in case of bad progress reporting:
+ fractionDoneNow = Math.Max(0, Math.Min(1, fractionDoneNow));
+ fractionDoneBefore = Math.Max(0, Math.Min(1, fractionDoneBefore));
+ if (task.IsIndeterminate) // avoid lock
+ {
+ task.IsIndeterminate = false;
+ }
+ if (task.MaxValue != value.TotalUnits) // etc
+ {
+ task.MaxValue = value.TotalUnits;
+ }
+ if (task.Value != value.UnitsCompleted) // etc
+ {
+ task.Value = value.UnitsCompleted;
+ }
+ if (fractionDoneNow > fractionDoneBefore)
+ {
+ // A subtle thread-safety point: we only ever *increase* the overall progress, never decrease it
+ // because while it generally won't be the case that progress callbacks are called out of order,
+ // there's no guarantee
+ //
+ // However, by only ever increasing, we can't process them out of order,
+ // (assuming TotalUnits is non-increasing and UnitsCompleted is non-decreasing)
+ // and thus we can incrementally update the overall progress without recalculating anything
+ // or doing any expensive serialization
+
+ // this isn't numerically stable (each project will likely add a tiny bit more or less than exactly 1 unit of progress,
+ // so we may not total exactly 1.0 at the end),
+ // but a double should have plenty of precision to be close enough and this is simple and very fast
+
+ // update overall progress
+ projectTrackingTask.Increment(fractionDoneNow - fractionDoneBefore);
+ }
+ }
+ }
+ });
+ await DecompileProjectAsync(projectContext, token, progress);
+ projectContext.task.StopTask();
+ });
+
+ var solutionTask = ctx.AddTask("Writing Solution File & Fixing Project References", new ProgressTaskSettings { MaxValue = 1 });
+
+ SolutionCreator.WriteSolutionFile(
+ Path.Combine(outputDirectory, Path.GetFileNameWithoutExtension(outputDirectory) + ".sln"),
+ projects.OrderBy(p => p.ProjectName).ToList());
+
+ solutionTask.Increment(1);
+ solutionTask.StopTask();
+
+ // order by project name for (more) deterministic output
+ // (plus it's probably what other tools do for maximum compatibility)
+ });
+ }
+ static async ValueTask DecompileProjectAsync(
+ (string name, ProgressTask task, DecompilerSettings settings, string[] referencePaths, (bool IsSet, string Value) inputPDBFile, ConcurrentBag projects, string outputDirectory, ProgressTask projectTrackingTask) projectContext,
+ CancellationToken token,
+ IProgress progress)
+ {
+ var (file, progressTask, settings, referencePaths, inputPDBFile, projects, outputDirectory, projectTrackingTask) = projectContext;
+ // add to the project display
+ progressTask.StartTask();
+
+ // ensure the directory and extract the base name
+ var fileBaseName = Path.GetFileNameWithoutExtension(file);
+ var projectDirectory = Path.Combine(outputDirectory, fileBaseName);
+ Directory.CreateDirectory(projectDirectory);
+ string projectFileName = Path.Combine(projectDirectory, $"{fileBaseName}.csproj");
+
+ var projectId = DecompileAsProject(
+ file,
+ projectDirectory,
+ settings.Clone(), // MUST be cloned, as DecompileAsProject will set UseSdkStyleProjectFormat
+ referencePaths,
+ inputPDBFile,
+ progress);
+
+ // projects is a ConcurrentBag, so it's thread-safe
+ projects.Add(new ProjectItem(
+ projectFileName,
+ projectId.PlatformName,
+ projectId.Guid,
+ projectId.TypeGuid));
+
+ progressTask.StopTask(); // remove from the progress display
}
- static ProjectId DecompileAsProject(string assemblyFileName, string outputDirectory, DecompilerSettings settings, string[] referencePaths, (bool IsSet, string Value) inputPDBFile)
+ static ProjectId DecompileAsProject(
+ string assemblyFileName,
+ string outputDirectory,
+ DecompilerSettings settings,
+ string[] referencePaths,
+ (bool IsSet, string Value) inputPDBFile,
+ IProgress progress = null)
{
try
{
@@ -553,7 +707,13 @@ static ProjectId DecompileAsProject(string assemblyFileName, string outputDirect
resolver,
TryLoadPDB(module, inputPDBFile));
using var projectFileWriter = new StreamWriter(File.OpenWrite(projectFileName));
- return decompiler.DecompileProject(module, Path.GetDirectoryName(projectFileName), projectFileWriter);
+ decompiler.ProgressIndicator = progress;
+ var result = decompiler.DecompileProject(
+ module,
+ Path.GetDirectoryName(projectFileName),
+ projectFileWriter);
+ decompiler.ProgressIndicator = null;
+ return result;
}
catch (Exception ex)
{
@@ -561,8 +721,13 @@ static ProjectId DecompileAsProject(string assemblyFileName, string outputDirect
}
}
- static int Decompile(string assemblyFileName, TextWriter output, DecompilerSettings settings,
- string[] referencePaths, string typeName, (bool IsSet, string Value) inputPDBFile)
+ static int Decompile(
+ string assemblyFileName,
+ TextWriter output,
+ DecompilerSettings settings,
+ string[] referencePaths,
+ string typeName,
+ (bool IsSet, string Value) inputPDBFile)
{
CSharpDecompiler decompiler = GetDecompiler(settings, assemblyFileName, referencePaths, inputPDBFile);
diff --git a/ICSharpCode.ILSpyCmd/packages.lock.json b/ICSharpCode.ILSpyCmd/packages.lock.json
index c330744439..c82f70e517 100644
--- a/ICSharpCode.ILSpyCmd/packages.lock.json
+++ b/ICSharpCode.ILSpyCmd/packages.lock.json
@@ -58,6 +58,18 @@
"resolved": "9.0.8",
"contentHash": "+mtc8dZnrP9N1HZICncBzLUrX4YBP+WvAWb817auAA5mKOJzHZShuGpCtQiekgV/7N0uS/x0LkdBAezBcSBwVA=="
},
+ "Spectre.Console": {
+ "type": "Direct",
+ "requested": "[0.49.1, )",
+ "resolved": "0.49.1",
+ "contentHash": "USV+pdu49OJ3nCjxNuw1K9Zw/c1HCBbwbjXZp0EOn6wM99tFdAtN34KEBZUMyRuJuXlUMDqhd8Yq9obW2MslYA=="
+ },
+ "System.Threading.Channels": {
+ "type": "Direct",
+ "requested": "[9.0.3, )",
+ "resolved": "9.0.3",
+ "contentHash": "Ao0iegVONKYVw0eWxJv0ArtMVfkFjgyyYKtUXru6xX5H95flSZWW3QCavD4PAgwpc0ETP38kGHaYbPzSE7sw2w=="
+ },
"TomsToolbox.Composition.Analyzer": {
"type": "Direct",
"requested": "[2.22.1, )",
diff --git a/ILSpy.AddIn.Shared/Resources.resx b/ILSpy.AddIn.Shared/Resources.resx
index 891c592b4f..352987aa07 100644
--- a/ILSpy.AddIn.Shared/Resources.resx
+++ b/ILSpy.AddIn.Shared/Resources.resx
@@ -1,129 +1,129 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
\ No newline at end of file
diff --git a/ILSpy.AddIn.Shared/VSPackage.en-US.resx b/ILSpy.AddIn.Shared/VSPackage.en-US.resx
index 73c158134b..be630617bb 100644
--- a/ILSpy.AddIn.Shared/VSPackage.en-US.resx
+++ b/ILSpy.AddIn.Shared/VSPackage.en-US.resx
@@ -1,126 +1,126 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- ILSpy.AddIn
-
-
- Integration of the ILSpy Decompiler into Visual Studio.
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ILSpy.AddIn
+
+
+ Integration of the ILSpy Decompiler into Visual Studio.
+
\ No newline at end of file
diff --git a/ILSpy.AddIn.Shared/VSPackage.resx b/ILSpy.AddIn.Shared/VSPackage.resx
index 4cb6bb52ea..ac306fde2d 100644
--- a/ILSpy.AddIn.Shared/VSPackage.resx
+++ b/ILSpy.AddIn.Shared/VSPackage.resx
@@ -1,140 +1,140 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- ILSpy.AddIn
-
-
- Integration of the ILSpy Decompiler into Visual Studio.
-
-
- ..\ILSpy.AddIn\Resources\Package.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ILSpy.AddIn
+
+
+ Integration of the ILSpy Decompiler into Visual Studio.
+
+
+ ..\ILSpy.AddIn\Resources\Package.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
\ No newline at end of file
diff --git a/ILSpy.AddIn.Shared/VSPackage.zh-Hans.resx b/ILSpy.AddIn.Shared/VSPackage.zh-Hans.resx
index db43f348a4..8f6681afd7 100644
--- a/ILSpy.AddIn.Shared/VSPackage.zh-Hans.resx
+++ b/ILSpy.AddIn.Shared/VSPackage.zh-Hans.resx
@@ -1,126 +1,126 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- ILSpy.AddIn
-
-
- 可以在 Visual Studio 中直接打开反编译工具 ILSpy 。
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ILSpy.AddIn
+
+
+ 可以在 Visual Studio 中直接打开反编译工具 ILSpy 。
+
\ No newline at end of file
diff --git a/ILSpy.ReadyToRun/Properties/Resources.resx b/ILSpy.ReadyToRun/Properties/Resources.resx
index bd77f2bf68..7aeb21499f 100644
--- a/ILSpy.ReadyToRun/Properties/Resources.resx
+++ b/ILSpy.ReadyToRun/Properties/Resources.resx
@@ -1,135 +1,135 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- Disassembly Format
-
-
- ReadyToRun
-
-
- Show Debug Info
-
-
- Show GC Info
-
-
- Show Stack Unwind Info
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Disassembly Format
+
+
+ ReadyToRun
+
+
+ Show Debug Info
+
+
+ Show GC Info
+
+
+ Show Stack Unwind Info
+
\ No newline at end of file
diff --git a/ILSpy.ReadyToRun/Properties/Resources.zh-Hans.resx b/ILSpy.ReadyToRun/Properties/Resources.zh-Hans.resx
index 57523b138a..5f7249cbb5 100644
--- a/ILSpy.ReadyToRun/Properties/Resources.zh-Hans.resx
+++ b/ILSpy.ReadyToRun/Properties/Resources.zh-Hans.resx
@@ -1,135 +1,135 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 反汇编格式
-
-
- ReadyToRun
-
-
- 显示调试信息
-
-
- 显示垃圾回收信息
-
-
- 显示堆栈展开信息
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 反汇编格式
+
+
+ ReadyToRun
+
+
+ 显示调试信息
+
+
+ 显示垃圾回收信息
+
+
+ 显示堆栈展开信息
+
\ No newline at end of file
diff --git a/ILSpy.Tests/IconContainer.resx b/ILSpy.Tests/IconContainer.resx
index 842140e25e..5ebbd1636c 100644
--- a/ILSpy.Tests/IconContainer.resx
+++ b/ILSpy.Tests/IconContainer.resx
@@ -1,124 +1,124 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
\ No newline at end of file
diff --git a/ILSpy.sln.DotSettings b/ILSpy.sln.DotSettings
index b57b13a4cf..ac5d73896b 100644
--- a/ILSpy.sln.DotSettings
+++ b/ILSpy.sln.DotSettings
@@ -2,6 +2,10 @@
CHOP_IF_LONG
IL
PDB
+ True
+ True
+ True
+ True
True
True
True
diff --git a/ILSpy/Properties/Resources.resx b/ILSpy/Properties/Resources.resx
index bb0d12dde9..01aec156d0 100644
--- a/ILSpy/Properties/Resources.resx
+++ b/ILSpy/Properties/Resources.resx
@@ -1,1135 +1,1135 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- About
-
-
- Add preconfigured list...
-
-
- Add shell integration
-
-
- This will add "{0}" to the registry at "HKCU\Software\Classes\dllfile\shell\Open with ILSpy\command" and "HKCU\Software\Classes\exefile\shell\Open with ILSpy\command" to allow opening .dll and .exe files from the Windows Explorer context menu.
-
-Do you want to continue?
-
-
- |All Files|*.*
-
-
- Allow multiple instances
-
-
- Always use braces
-
-
- Analyze
-
-
- Assemblies
-
-
- Assembly
-
-
- The directory is not empty. File will be overwritten.
-Are you sure you want to continue?
-
-
- Project Directory not empty
-
-
- Automatically check for updates every week
-
-
- Back
-
-
- Base Types
-
-
- C_lone
-
-
- Cancel
-
-
- Entity could not be resolved. Cannot analyze entities from missing assembly references. Add the missing reference and try again.
-
-
- Cannot create PDB file for {0}, because it does not contain a PE Debug Directory Entry of type 'CodeView'.
-
-
- Check again
-
-
- Check for updates
-
-
- Checking...
-
-
- Clear assembly list
-
-
- Close
-
-
- Collapse all tree nodes
-
-
- Copy
-
-
- Copy error message
-
-
- Copy FQ Name
-
-
- Could not use SDK-style project format, because no compatible target-framework moniker was found.
-
-
- Create
-
-
- Creating diagram...
-
-
- Culture
-
-
- DEBUG -- Decompile All
-
-
- DEBUG -- Decompile 100x
-
-
- DEBUG -- Disassemble All
-
-
- DEBUG -- Dump PDB as XML
-
-
- Debug Steps
-
-
- Debug this step
-
-
- Decompilation complete in {0:F1} seconds.
-
-
- Decompilation view options
-
-
- Decompilation was cancelled.
-
-
- Decompile
-
-
- Decompile to new tab
-
-
- Decompiler
-
-
- Always inline local variables if possible
-
-
- Allow extension 'Add' methods in collection initializer expressions
-
-
- Use 'ref' extension methods
-
-
- Always cast targets of explicit interface implementation calls
-
-
- Always move field initializers from constructors to declarations
-
-
- Always qualify member references
-
-
- Always show enum member values
-
-
- Always use braces
-
-
- Always fully qualify namespaces using the "global::" prefix
-
-
- Apply Windows Runtime projections on loaded assemblies
-
-
- Array initializer expressions
-
-
- Decompile async IAsyncEnumerator methods
-
-
- Automatically load assembly references
-
-
- Check for overflow and underflow in operators
-
-
- User-defined checked operators
-
-
- Decompile anonymous methods/lambdas
-
-
- Decompile anonymous types
-
-
- Decompile async methods
-
-
- Decompile automatic events
-
-
- Decompile automatic properties
-
-
- Decompile await in catch/finally blocks
-
-
- Decompile C# 1.0 'public unsafe fixed int arr[10];' members
-
-
- Decompile [DecimalConstant(...)] as simple literal values
-
-
- Decompile enumerators (yield return)
-
-
- Decompile expression trees
-
-
- Decompile foreach statements with GetEnumerator extension methods
-
-
- Decompile params collections
-
-
- Decompile use of the 'dynamic' type
-
-
- Detect deconstruction assignments
-
-
- Detect awaited using and foreach statements
-
-
- Detect foreach statements
-
-
- Detect lock statements
-
-
- Detect switch on string
-
-
- Detect tuple comparisons
-
-
- Detect using statements
-
-
- Dictionary initializer expressions
-
-
- Transform to do-while, if possible
-
-
- Expand params arguments by removing explicit array creation
-
-
- F#-specific options
-
-
- Use file-scoped namespace declarations
-
-
- Transform to for, if possible
-
-
- Function pointers
-
-
- Decompile getter-only automatic properties
-
-
- Include XML documentation comments in the decompiled code
-
-
- Allow init; accessors
-
-
- Insert using declarations
-
-
- Introduce local functions
-
-
- Introduce 'private protected' accessibility
-
-
- Introduce static local functions
-
-
- IsByRefLikeAttribute should be replaced with 'ref' modifiers on structs
-
-
- IsReadOnlyAttribute should be replaced with 'readonly'/'in' modifiers on structs/parameters
-
-
- IsUnmanagedAttribute on type parameters should be replaced with 'unmanaged' constraints
-
-
- Use nint/nuint types
-
-
- Decompile ?. and ?[] operators
-
-
- Nullable reference types
-
-
- Treat (U)IntPtr as n(u)int
-
-
- Object/collection initializer expressions
-
-
- Other
-
-
- Pattern combinators (and, or, not)
-
-
- Use pattern matching expressions
-
-
- Project export
-
-
- Ranges
-
-
- Read-only methods
-
-
- Record classes
-
-
- Record structs
-
-
- Recursive pattern matching
-
-
- 'ref readonly' parameters
-
-
- Relational patterns
-
-
- Remove dead and side effect free code (use with caution!)
-
-
- Remove dead stores (use with caution!)
-
-
- Remove optional arguments, if possible
-
-
- Required members
-
-
- 'scoped' lifetime annotation
-
-
- Separate local variable declarations and initializers (int x = 5; -> int x; x = 5;), if possible
-
-
- Show info from debug symbols, if available
-
-
- Sort custom attributes
-
-
- Detect switch on integer even if IL code does not use a jump table
-
-
- Decompile 'string.Concat(a, b)' calls into 'a + b'
-
-
- Switch expressions
-
-
- Use switch on (ReadOnly)Span<char>
-
-
- Unsigned right shift (>>>)
-
-
- Use discards
-
-
- Use enhanced using variable declarations
-
-
- Use expression-bodied member syntax for get-only properties
-
-
- Use extension method syntax
-
-
- Use implicit conversions between tuple types
-
-
- Use implicit method group conversions
-
-
- Use LINQ expression syntax
-
-
- Use lambda syntax, if possible
-
-
- Use lifted operators for nullables
-
-
- Use named arguments
-
-
- Use nested directories for namespaces
-
-
- Use non-trailing named arguments
-
-
- Use new T() instead of Activator.CreateInstance<T>
-
-
- Use out variable declarations
-
-
- Use pattern-based fixed statement
-
-
- Use primary constructor syntax for non-record types
-
-
- Use primary constructor syntax with records
-
-
- Use primary constructor syntax for non-record types
-
-
- Use ref locals to accurately represent order of evaluation
-
-
- Use new SDK style format for generated project files (*.csproj)
-
-
- Use stackalloc initializer syntax
-
-
- Use string interpolation
-
-
- Use throw expressions
-
-
- Use tuple type syntax
-
-
- Use variable names from debug symbols, if available
-
-
- UTF-8 string literals
-
-
- VB-specific options
-
-
- 'with' initializer expressions
-
-
- The settings selected below are applied to the decompiler output in combination with the selection in the language drop-down. Selecting a lower language version in the drop-down will deactivate all selected options of the higher versions. Note that some settings implicitly depend on each other, e.g.: LINQ expressions cannot be introduced without first transforming static calls to extension method calls.
-
-
- Decompiling...
-
-
- Dependencies
-
-
- Derived Types
-
-
- Display
-
-
- Display Code
-
-
- Font:
-
-
- Theme:
-
-
- Download
-
-
- E_xit
-
-
- Editor
-
-
- Enable folding on all blocks in braces
-
-
- Enable smooth scrolling
-
-
- Enable word wrap
-
-
- Enter a list name:
-
-
- Exit
-
-
- Expand member definitions after decompilation
-
-
- Expand using declarations after decompilation
-
-
- Extract all package entries
-
-
- Extract package entry
-
-
- Folding
-
-
- Font
-
-
- Forward
-
-
- Generate portable PDB
-
-
- Generation complete in {0} seconds.
-
-
- Generation was cancelled.
-
-
- Go to token
-
-
- Hide empty metadata tables from tree view
-
-
- Highlight current line
-
-
- Highlight matching braces
-
-
- ILSpyAboutPage.txt
-
-
- ILSpy version
-
-
- A new ILSpy version is available.
-
-
- Indent size:
-
-
- Indentation
-
-
- Insert using declarations
-
-
- Are you sure that you want to delete the selected assembly list?
-
-
- A list with the same name was found.
-
-
- Are you sure that you want to remove all assembly lists and recreate the default assembly lists?
-
-
- Load assemblies that were loaded in the last instance.
-
-
- Loading...
-
-
- Location
-
-
- Manage Assembly Lists
-
-
- Manage assembly _lists...
-
-
- Metadata
-
-
- Misc
-
-
- .NET version
-
-
- Name
-
-
- Navigation
-
-
- Navigation failed because the target is hidden or a compiler-generated class.\n
-Please disable all filters that might hide the item (i.e. activate "View > Show internal types and members") and try again.
-
-
- New list
-
-
- New Tab
-
-
- Nuget Package Browser
-
-
- OK
-
-
- Open
-
-
- Open Explorer
-
-
- Open From GAC
-
-
- Open from _GAC...
-
-
- _Delete
-
-
- _Open
-
-
- Operation was cancelled.
-
-
- Options
-
-
- Other
-
-
- Other options
-
-
- Other Resources
-
-
- Portable PDB|*.pdb|All files|*.*
-
-
- You can change this by toggling the setting at Options > Decompiler > Project export > Use new SDK style format for generated project files (*.csproj).
-
-
- A Non-SDK project was generated. Learn more at https://docs.microsoft.com/en-us/nuget/resources/check-project-format.
-
-
- A SDK-style project was generated. Learn more at https://docs.microsoft.com/en-us/nuget/resources/check-project-format.
-
-
- Failed to decompile the assemblies {0} because the namespace names are too long or the directory structure is nested too deep.
-
-If you are using Windows 10.0.14393 (Windows 10 version 1607) or later, you can enable "Long path support" by creating a REG_DWORD registry key named "LongPathsEnabled" with value 0x1 at "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" (see https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation for more information).
-
-If this does not solve the problem and your system supports long paths, you can try to use a nested path structure. You can change this by toggling the setting at Options > Decompiler > Project export > Use nested directories for namespaces. This helps because even on "long-path-aware" platforms, the length of a directory name is limited, on Windows/NTFS this is 255 characters.
-
-
- for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
-
-
- Public Key Token
-
-
- R_ename
-
-
- Reference Name
-
-
- References
-
-
- Reload all assemblies
-
-
- Reload all assemblies
-
-
- Remove
-
-
- Remove dead and side effect free code
-
-
- Remove shell integration
-
-
- This will remove "{0}" from the registry at "HKCU\Software\Classes\dllfile\shell\Open with ILSpy\command" and "HKCU\Software\Classes\exefile\shell\Open with ILSpy\command".
-
-Do you want to continue?
-
-
- Rename list
-
-
- Reset to defaults
-
-
- Do you really want to load the default settings for the active page?
-
-
- Resources file (*.resources)|*.resources|Resource XML file|*.resx
-
-
- Save
-
-
- Save Code
-
-
- Scope search to this assembly
-
-
- Scope search to this namespace
-
-
- Search...
-
-
- Search aborted, more than 1000 results found.
-
-
- Search (Ctrl+Shift+F or Ctrl+E)
-
-
- Search Microsoft Docs...
-
-
- Search
-
-
- Searching...
-
-
- Select All
-
-
- Select assemblies to open:
-
-
- Select a list of assemblies (Alt+A)
-
-
- Select language to decompile to (Alt+L)
-
-
- Select a list:
-
-
- Select PDB...
-
-
- Select version of language to output (Alt+E)
-
-
- You must restart ILSpy for the change to take effect.
-
-
- Shell
-
-
- Show all types and members
-
-
- Show assembly load log
-
-
- ShowChildIndexInBlock
-
-
- Show XML documentation in decompiled code
-
-
- ShowILRanges
-
-
- Show info from debug symbols, if available
-
-
- Show public, private and internal
-
-
- Show line numbers
-
-
- Show metadata tokens
-
-
- Show metadata tokens in base 10
-
-
- Show only public types and members
-
-
- Show raw offsets and bytes before each instruction
-
-
- Show state after this step
-
-
- Show state before this step
-
-
- Show _all types and members
-
-
- Show public, private and internal
-
-
- Show only _public types and members
-
-
- Size:
-
-
- Sort assembly list by name
-
-
- Sort assembly _list by name
-
-
- Sort results by fitness
-
-
- Stand by...
-
-
- Status
-
-
- String Table
-
-
- Style the window title bar
-
-
- Tab size:
-
-
- Theme
-
-
- Toggle All Folding
-
-
- Tree view options
-
-
- Type
-
-
- UI Language
-
-
- System
-
-
- No update for ILSpy found.
-
-
- UseFieldSugar
-
-
- UseLogicOperationSugar
-
-
- Use nested namespace structure
-
-
- Use tabs instead of spaces
-
-
- You are using the latest release.
-
-
- You are using a nightly build newer than the latest release.
-
-
- Value
-
-
- Value (as string)
-
-
- Use variable names from debug symbols, if available
-
-
- Version
-
-
- Version {0} is available.
-
-
- View
-
-
- Visual Studio Solution file|*.sln|All files|*.*
-
-
- Warning: This assembly is marked as 'reference assembly', which means that it only contains metadata and no executable code.
-
-
- Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
-
-
- Search for t:TypeName, m:Member or c:Constant; use exact match (=term), 'should not contain' (-term) or 'must contain' (+term); use /reg(ular)?Ex(pressions)?/ or both - t:/Type(Name)?/...
-
-
- _Close all documents
-
-
- _Reset layout
-
-
- _About
-
-
- _Add To Main List
-
-
- Analy_zer
-
-
- _Assemblies
-
-
- _Check for Updates
-
-
- _Collapse all tree nodes
-
-
- Create _Diagram...
-
-
- _File
-
-
- _Help
-
-
- _Load Dependencies
-
-
- _New
-
-
- _Open...
-
-
- _Open Command Line Here
-
-
- _Open Containing Folder
-
-
- _Options...
-
-
- _Reload
-
-
- _Remove
-
-
- _Remove Assemblies with load errors
-
-
- _Reset
-
-
- Resources
-
-
- _Save Code...
-
-
- _Search:
-
-
- _Search for:
-
-
- _Show debug steps
-
-
- Toggle Folding
-
-
- _View
-
-
- _Window
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ About
+
+
+ Add preconfigured list...
+
+
+ Add shell integration
+
+
+ This will add "{0}" to the registry at "HKCU\Software\Classes\dllfile\shell\Open with ILSpy\command" and "HKCU\Software\Classes\exefile\shell\Open with ILSpy\command" to allow opening .dll and .exe files from the Windows Explorer context menu.
+
+Do you want to continue?
+
+
+ |All Files|*.*
+
+
+ Allow multiple instances
+
+
+ Always use braces
+
+
+ Analyze
+
+
+ Assemblies
+
+
+ Assembly
+
+
+ The directory is not empty. File will be overwritten.
+Are you sure you want to continue?
+
+
+ Project Directory not empty
+
+
+ Automatically check for updates every week
+
+
+ Back
+
+
+ Base Types
+
+
+ C_lone
+
+
+ Cancel
+
+
+ Entity could not be resolved. Cannot analyze entities from missing assembly references. Add the missing reference and try again.
+
+
+ Cannot create PDB file for {0}, because it does not contain a PE Debug Directory Entry of type 'CodeView'.
+
+
+ Check again
+
+
+ Check for updates
+
+
+ Checking...
+
+
+ Clear assembly list
+
+
+ Close
+
+
+ Collapse all tree nodes
+
+
+ Copy
+
+
+ Copy error message
+
+
+ Copy FQ Name
+
+
+ Could not use SDK-style project format, because no compatible target-framework moniker was found.
+
+
+ Create
+
+
+ Creating diagram...
+
+
+ Culture
+
+
+ DEBUG -- Decompile All
+
+
+ DEBUG -- Decompile 100x
+
+
+ DEBUG -- Disassemble All
+
+
+ DEBUG -- Dump PDB as XML
+
+
+ Debug Steps
+
+
+ Debug this step
+
+
+ Decompilation complete in {0:F1} seconds.
+
+
+ Decompilation view options
+
+
+ Decompilation was cancelled.
+
+
+ Decompile
+
+
+ Decompile to new tab
+
+
+ Decompiler
+
+
+ Always inline local variables if possible
+
+
+ Allow extension 'Add' methods in collection initializer expressions
+
+
+ Use 'ref' extension methods
+
+
+ Always cast targets of explicit interface implementation calls
+
+
+ Always move field initializers from constructors to declarations
+
+
+ Always qualify member references
+
+
+ Always show enum member values
+
+
+ Always use braces
+
+
+ Always fully qualify namespaces using the "global::" prefix
+
+
+ Apply Windows Runtime projections on loaded assemblies
+
+
+ Array initializer expressions
+
+
+ Decompile async IAsyncEnumerator methods
+
+
+ Automatically load assembly references
+
+
+ Check for overflow and underflow in operators
+
+
+ User-defined checked operators
+
+
+ Decompile anonymous methods/lambdas
+
+
+ Decompile anonymous types
+
+
+ Decompile async methods
+
+
+ Decompile automatic events
+
+
+ Decompile automatic properties
+
+
+ Decompile await in catch/finally blocks
+
+
+ Decompile C# 1.0 'public unsafe fixed int arr[10];' members
+
+
+ Decompile [DecimalConstant(...)] as simple literal values
+
+
+ Decompile enumerators (yield return)
+
+
+ Decompile expression trees
+
+
+ Decompile foreach statements with GetEnumerator extension methods
+
+
+ Decompile params collections
+
+
+ Decompile use of the 'dynamic' type
+
+
+ Detect deconstruction assignments
+
+
+ Detect awaited using and foreach statements
+
+
+ Detect foreach statements
+
+
+ Detect lock statements
+
+
+ Detect switch on string
+
+
+ Detect tuple comparisons
+
+
+ Detect using statements
+
+
+ Dictionary initializer expressions
+
+
+ Transform to do-while, if possible
+
+
+ Expand params arguments by removing explicit array creation
+
+
+ F#-specific options
+
+
+ Use file-scoped namespace declarations
+
+
+ Transform to for, if possible
+
+
+ Function pointers
+
+
+ Decompile getter-only automatic properties
+
+
+ Include XML documentation comments in the decompiled code
+
+
+ Allow init; accessors
+
+
+ Insert using declarations
+
+
+ Introduce local functions
+
+
+ Introduce 'private protected' accessibility
+
+
+ Introduce static local functions
+
+
+ IsByRefLikeAttribute should be replaced with 'ref' modifiers on structs
+
+
+ IsReadOnlyAttribute should be replaced with 'readonly'/'in' modifiers on structs/parameters
+
+
+ IsUnmanagedAttribute on type parameters should be replaced with 'unmanaged' constraints
+
+
+ Use nint/nuint types
+
+
+ Decompile ?. and ?[] operators
+
+
+ Nullable reference types
+
+
+ Treat (U)IntPtr as n(u)int
+
+
+ Object/collection initializer expressions
+
+
+ Other
+
+
+ Pattern combinators (and, or, not)
+
+
+ Use pattern matching expressions
+
+
+ Project export
+
+
+ Ranges
+
+
+ Read-only methods
+
+
+ Record classes
+
+
+ Record structs
+
+
+ Recursive pattern matching
+
+
+ 'ref readonly' parameters
+
+
+ Relational patterns
+
+
+ Remove dead and side effect free code (use with caution!)
+
+
+ Remove dead stores (use with caution!)
+
+
+ Remove optional arguments, if possible
+
+
+ Required members
+
+
+ 'scoped' lifetime annotation
+
+
+ Separate local variable declarations and initializers (int x = 5; -> int x; x = 5;), if possible
+
+
+ Show info from debug symbols, if available
+
+
+ Sort custom attributes
+
+
+ Detect switch on integer even if IL code does not use a jump table
+
+
+ Decompile 'string.Concat(a, b)' calls into 'a + b'
+
+
+ Switch expressions
+
+
+ Use switch on (ReadOnly)Span<char>
+
+
+ Unsigned right shift (>>>)
+
+
+ Use discards
+
+
+ Use enhanced using variable declarations
+
+
+ Use expression-bodied member syntax for get-only properties
+
+
+ Use extension method syntax
+
+
+ Use implicit conversions between tuple types
+
+
+ Use implicit method group conversions
+
+
+ Use LINQ expression syntax
+
+
+ Use lambda syntax, if possible
+
+
+ Use lifted operators for nullables
+
+
+ Use named arguments
+
+
+ Use nested directories for namespaces
+
+
+ Use non-trailing named arguments
+
+
+ Use new T() instead of Activator.CreateInstance<T>
+
+
+ Use out variable declarations
+
+
+ Use pattern-based fixed statement
+
+
+ Use primary constructor syntax for non-record types
+
+
+ Use primary constructor syntax with records
+
+
+ Use primary constructor syntax for non-record types
+
+
+ Use ref locals to accurately represent order of evaluation
+
+
+ Use new SDK style format for generated project files (*.csproj)
+
+
+ Use stackalloc initializer syntax
+
+
+ Use string interpolation
+
+
+ Use throw expressions
+
+
+ Use tuple type syntax
+
+
+ Use variable names from debug symbols, if available
+
+
+ UTF-8 string literals
+
+
+ VB-specific options
+
+
+ 'with' initializer expressions
+
+
+ The settings selected below are applied to the decompiler output in combination with the selection in the language drop-down. Selecting a lower language version in the drop-down will deactivate all selected options of the higher versions. Note that some settings implicitly depend on each other, e.g.: LINQ expressions cannot be introduced without first transforming static calls to extension method calls.
+
+
+ Decompiling...
+
+
+ Dependencies
+
+
+ Derived Types
+
+
+ Display
+
+
+ Display Code
+
+
+ Font:
+
+
+ Theme:
+
+
+ Download
+
+
+ E_xit
+
+
+ Editor
+
+
+ Enable folding on all blocks in braces
+
+
+ Enable smooth scrolling
+
+
+ Enable word wrap
+
+
+ Enter a list name:
+
+
+ Exit
+
+
+ Expand member definitions after decompilation
+
+
+ Expand using declarations after decompilation
+
+
+ Extract all package entries
+
+
+ Extract package entry
+
+
+ Folding
+
+
+ Font
+
+
+ Forward
+
+
+ Generate portable PDB
+
+
+ Generation complete in {0} seconds.
+
+
+ Generation was cancelled.
+
+
+ Go to token
+
+
+ Hide empty metadata tables from tree view
+
+
+ Highlight current line
+
+
+ Highlight matching braces
+
+
+ ILSpyAboutPage.txt
+
+
+ ILSpy version
+
+
+ A new ILSpy version is available.
+
+
+ Indent size:
+
+
+ Indentation
+
+
+ Insert using declarations
+
+
+ Are you sure that you want to delete the selected assembly list?
+
+
+ A list with the same name was found.
+
+
+ Are you sure that you want to remove all assembly lists and recreate the default assembly lists?
+
+
+ Load assemblies that were loaded in the last instance.
+
+
+ Loading...
+
+
+ Location
+
+
+ Manage Assembly Lists
+
+
+ Manage assembly _lists...
+
+
+ Metadata
+
+
+ Misc
+
+
+ .NET version
+
+
+ Name
+
+
+ Navigation
+
+
+ Navigation failed because the target is hidden or a compiler-generated class.\n
+Please disable all filters that might hide the item (i.e. activate "View > Show internal types and members") and try again.
+
+
+ New list
+
+
+ New Tab
+
+
+ Nuget Package Browser
+
+
+ OK
+
+
+ Open
+
+
+ Open Explorer
+
+
+ Open From GAC
+
+
+ Open from _GAC...
+
+
+ _Delete
+
+
+ _Open
+
+
+ Operation was cancelled.
+
+
+ Options
+
+
+ Other
+
+
+ Other options
+
+
+ Other Resources
+
+
+ Portable PDB|*.pdb|All files|*.*
+
+
+ You can change this by toggling the setting at Options > Decompiler > Project export > Use new SDK style format for generated project files (*.csproj).
+
+
+ A Non-SDK project was generated. Learn more at https://docs.microsoft.com/en-us/nuget/resources/check-project-format.
+
+
+ A SDK-style project was generated. Learn more at https://docs.microsoft.com/en-us/nuget/resources/check-project-format.
+
+
+ Failed to decompile the assemblies {0} because the namespace names are too long or the directory structure is nested too deep.
+
+If you are using Windows 10.0.14393 (Windows 10 version 1607) or later, you can enable "Long path support" by creating a REG_DWORD registry key named "LongPathsEnabled" with value 0x1 at "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" (see https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation for more information).
+
+If this does not solve the problem and your system supports long paths, you can try to use a nested path structure. You can change this by toggling the setting at Options > Decompiler > Project export > Use nested directories for namespaces. This helps because even on "long-path-aware" platforms, the length of a directory name is limited, on Windows/NTFS this is 255 characters.
+
+
+ for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
+
+
+ Public Key Token
+
+
+ R_ename
+
+
+ Reference Name
+
+
+ References
+
+
+ Reload all assemblies
+
+
+ Reload all assemblies
+
+
+ Remove
+
+
+ Remove dead and side effect free code
+
+
+ Remove shell integration
+
+
+ This will remove "{0}" from the registry at "HKCU\Software\Classes\dllfile\shell\Open with ILSpy\command" and "HKCU\Software\Classes\exefile\shell\Open with ILSpy\command".
+
+Do you want to continue?
+
+
+ Rename list
+
+
+ Reset to defaults
+
+
+ Do you really want to load the default settings for the active page?
+
+
+ Resources file (*.resources)|*.resources|Resource XML file|*.resx
+
+
+ Save
+
+
+ Save Code
+
+
+ Scope search to this assembly
+
+
+ Scope search to this namespace
+
+
+ Search...
+
+
+ Search aborted, more than 1000 results found.
+
+
+ Search (Ctrl+Shift+F or Ctrl+E)
+
+
+ Search Microsoft Docs...
+
+
+ Search
+
+
+ Searching...
+
+
+ Select All
+
+
+ Select assemblies to open:
+
+
+ Select a list of assemblies (Alt+A)
+
+
+ Select language to decompile to (Alt+L)
+
+
+ Select a list:
+
+
+ Select PDB...
+
+
+ Select version of language to output (Alt+E)
+
+
+ You must restart ILSpy for the change to take effect.
+
+
+ Shell
+
+
+ Show all types and members
+
+
+ Show assembly load log
+
+
+ ShowChildIndexInBlock
+
+
+ Show XML documentation in decompiled code
+
+
+ ShowILRanges
+
+
+ Show info from debug symbols, if available
+
+
+ Show public, private and internal
+
+
+ Show line numbers
+
+
+ Show metadata tokens
+
+
+ Show metadata tokens in base 10
+
+
+ Show only public types and members
+
+
+ Show raw offsets and bytes before each instruction
+
+
+ Show state after this step
+
+
+ Show state before this step
+
+
+ Show _all types and members
+
+
+ Show public, private and internal
+
+
+ Show only _public types and members
+
+
+ Size:
+
+
+ Sort assembly list by name
+
+
+ Sort assembly _list by name
+
+
+ Sort results by fitness
+
+
+ Stand by...
+
+
+ Status
+
+
+ String Table
+
+
+ Style the window title bar
+
+
+ Tab size:
+
+
+ Theme
+
+
+ Toggle All Folding
+
+
+ Tree view options
+
+
+ Type
+
+
+ UI Language
+
+
+ System
+
+
+ No update for ILSpy found.
+
+
+ UseFieldSugar
+
+
+ UseLogicOperationSugar
+
+
+ Use nested namespace structure
+
+
+ Use tabs instead of spaces
+
+
+ You are using the latest release.
+
+
+ You are using a nightly build newer than the latest release.
+
+
+ Value
+
+
+ Value (as string)
+
+
+ Use variable names from debug symbols, if available
+
+
+ Version
+
+
+ Version {0} is available.
+
+
+ View
+
+
+ Visual Studio Solution file|*.sln|All files|*.*
+
+
+ Warning: This assembly is marked as 'reference assembly', which means that it only contains metadata and no executable code.
+
+
+ Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
+
+
+ Search for t:TypeName, m:Member or c:Constant; use exact match (=term), 'should not contain' (-term) or 'must contain' (+term); use /reg(ular)?Ex(pressions)?/ or both - t:/Type(Name)?/...
+
+
+ _Close all documents
+
+
+ _Reset layout
+
+
+ _About
+
+
+ _Add To Main List
+
+
+ Analy_zer
+
+
+ _Assemblies
+
+
+ _Check for Updates
+
+
+ _Collapse all tree nodes
+
+
+ Create _Diagram...
+
+
+ _File
+
+
+ _Help
+
+
+ _Load Dependencies
+
+
+ _New
+
+
+ _Open...
+
+
+ _Open Command Line Here
+
+
+ _Open Containing Folder
+
+
+ _Options...
+
+
+ _Reload
+
+
+ _Remove
+
+
+ _Remove Assemblies with load errors
+
+
+ _Reset
+
+
+ Resources
+
+
+ _Save Code...
+
+
+ _Search:
+
+
+ _Search for:
+
+
+ _Show debug steps
+
+
+ Toggle Folding
+
+
+ _View
+
+
+ _Window
+
\ No newline at end of file
diff --git a/ILSpy/Properties/Resources.zh-Hans.resx b/ILSpy/Properties/Resources.zh-Hans.resx
index d61d8f79e7..cd10befd11 100644
--- a/ILSpy/Properties/Resources.zh-Hans.resx
+++ b/ILSpy/Properties/Resources.zh-Hans.resx
@@ -1,1082 +1,1082 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- 关于
-
-
- 添加预配置列表...
-
-
- 添加文件资源管理器集成
-
-
- 这会在注册表的“HKCU\Software\Classes\dllfile\shell\Open with ILSpy\command”与“HKCU\Software\Classes\exefile\shell\Open with ILSpy\command”中添加“{0}”。这样在文件资源管理器中,.dll 文件与 .exe 文件可以在右键菜单中使用 ILSpy 打开。
-
-确定继续?
-
-
- |所有文件|*.*
-
-
- 允许多个实例
-
-
- 始终使用大括号
-
-
- 分析
-
-
- 程序集
-
-
- 程序集
-
-
- 目录非空。文件会被覆盖。
-确定继续?
-
-
- 项目目录非空
-
-
- 每周自动检查更新
-
-
- 后退
-
-
- 基类型
-
-
- 克隆(_L)
-
-
- 取消
-
-
- 无法解析实体。可能是由于缺少程序集引用。请添加缺少的程序集并重试。
-
-
- 无法创建为{0}创建PDB文件,因为它不包含PE调试目录类型 'CodeView'.
-
-
- 再次检查
-
-
- 检查更新
-
-
- 检查...
-
-
- 关闭
-
-
- 折叠所有树节点
-
-
- 复制
-
-
- 复制错误信息
-
-
- 复制完全限定名称
-
-
- 无法使用SDK-style项目格式,因为发现有不兼容目标框架别名。
-
-
- 创建
-
-
- 区域
-
-
- 调试 -- 全部反编译到 C#
-
-
- 调试 -- 反编译100次
-
-
- 调试 -- 全部反编译到 IL
-
-
- 调试 -- PDB 转储为 XML
-
-
- 调试步骤
-
-
- 调试此步骤
-
-
- 反编译完成。耗时 {0:F1} 秒。
-
-
- 反编译视图选项
-
-
- 反编译已取消。
-
-
- 反编译
-
-
- 在新选项卡反编译
-
-
- 反编译器
-
-
- 如果可能,始终内联局部变量
-
-
- 允许使用 Add 扩展方法的集合初始化器表达式
-
-
- 使用 ref 扩展方法
-
-
- 始终强制转换显式接口实现调用的目标
-
-
-
-
-
- 始终限定成员引用
-
-
- 始终显示枚举数值
-
-
- 始终使用大括号
-
-
- 总是使用 "global::" 完全限定命名空间
-
-
- 在已加载的程序集上应用 Windows 运行时投影
-
-
- 数组初始化器表达式
-
-
- 反编译异步 IAsyncEnumerator 方法
-
-
-
-
-
- 反编译匿名方法或 lambda
-
-
- 反编译匿名类型
-
-
- 反编译异步方法
-
-
- 反编译自动事件
-
-
- 反编译自动属性
-
-
- 反编译 catch/finally 内的 await
-
-
- 反编译 C# 1.0“public unsafe fixed int arr[10];”成员
-
-
- 反编译 [DecimalConstant(...)] 作为简单的字面值
-
-
- 反编译枚举器(yield return)
-
-
- 反编译表达树
-
-
- 反编译使用 GetEnumerator 扩展方法的 foreach 语句
-
-
-
-
-
- 反编译 dynamic 类型
-
-
- 检测解构赋值
-
-
- 检测使用了 await 的 using 和 foreach 块
-
-
- 检测 foreach 语句
-
-
- 检测 lock 语句
-
-
- 检测字符串 switch 语句
-
-
- 检测元组比较
-
-
- 检测 using 语句
-
-
- Dictionary 初始值设定项表达式
-
-
- 如果可能,转换到 do-while 块
-
-
- F# 特定选项
-
-
- 使用文件作用域命名空间表达式 (File-scoped namespace)
-
-
- 如果可能,转换到 for 块
-
-
- 函数指针
-
-
- 反编译 getter-only 自动属性
-
-
- 在反编译代码中包括 XML 文档注释
-
-
- 允许 init; 访问器
-
-
- 插入 using 声明
-
-
- 引入局部函数(local functions)
-
-
-
-
-
- 引入静态局部函数(static local functions)
-
-
- IsByRefLikeAttribute 应替换为结构上的 ref 修饰符
-
-
- IsReadOnlyAttribute 应替为结构参数上的 readonly/in 中的修饰符
-
-
- 类型参数上的 IsUnmanagedAttribute 应替换为 unmanaged 约束
-
-
- 'scoped' 生命周期注解关键字
-
-
- 使用 nint/nuint 类型
-
-
- 反编译 ?. 和 ?[] 运算符
-
-
- 可空引用类型
-
-
- 对象或集合初始化器表达式
-
-
- 其他
-
-
- 使用模式匹配表达式
-
-
- 项目导出
-
-
- 范围(ranges)
-
-
- 只读方法
-
-
- 记录
-
-
- 记录结构
-
-
- 删除死代码和无副作用的代码(请谨慎使用)
-
-
- 删除死值(请谨慎使用)
-
-
- 如果可能,删除可选参数
-
-
- Required 必要成员
-
-
- 如果可能,分离局部变量的声明与初始化(int x = 5; -> int x; x = 5;)
-
-
- 显示调试符号中的信息(如果可用)
-
-
-
-
-
- 检测整型 switch 即使 IL 代码不使用跳转表
-
-
- 反编译 'string.Concat(a, b)' 调用为 'a + b'
-
-
- switch 表达式
-
-
- 使用弃元
-
-
- 使用增强的 using 变量声明
-
-
- 对仅有 getter 访问器的属性使用 Expression-bodied 成员语法
-
-
- 使用扩展方法语法
-
-
- 在元组类型之间使用隐式转换
-
-
- 使用隐式方法组转换
-
-
- 使用 LINQ 表达式语法
-
-
- 如果可能, 请使用 lambda 语法
-
-
- 对可为空类型使用提升运算符
-
-
- 使用命名参数
-
-
- 为命名空间使用嵌套目录
-
-
- 使用非尾随命名参数
-
-
-
-
-
- 使用 out 变量声明
-
-
- 使用基于模式的 fixed 语句
-
-
- 使用带有记录的主构造器语法
-
-
-
-
-
- 使用 ref 局部变量以准确表达求值顺序
-
-
- 使用新的 SDK 样式(*.csproj)生成项目文件
-
-
- 使用 stackalloc 初始化器语法
-
-
- 使用字符串内插
-
-
- 使用 throw 表达式
-
-
- 使用元组类型语法
-
-
- 使用调试符号中的变量名(如果可用)
-
-
- VB 特定选项
-
-
- 'with' 初始化器表达式
-
-
- 下面选择的设置将与语言下拉列表中的选择一起应用于反编译程序输出。在下拉列表中选择较低的语言版本将停用较高版本的所有选定选项。请注意, 某些设置隐式依赖于彼此, 例如: 如果不首先将静态调用转换为扩展方法调用, 则无法引入 LINQ 表达式。
-
-
- 正在反编译...
-
-
- 依赖(_L)
-
-
- 派生类型
-
-
- 显示
-
-
- 显示代码
-
-
- 字体:
-
-
- 主题:
-
-
- 下载
-
-
- 退出(_X)
-
-
- 编辑器
-
-
- 在大括号中的所有块上启用折叠
-
-
- 启用自动换行
-
-
- 输入列表名称:
-
-
- 退出
-
-
- 在反编译后展开成员定义
-
-
- 反编译后展开引用和声明
-
-
- 提取所有包条目
-
-
- 提取包条目
-
-
- 折叠
-
-
- 字体
-
-
- 前进
-
-
- 生成 Portable PDB
-
-
- 生成完成,耗时 {0} 秒。
-
-
- 已取消生成。
-
-
- 转至令牌
-
-
- 在树视图中隐藏空的元数据表
-
-
- 高亮当前行
-
-
- 高亮配对的大括号
-
-
- ILSpyAboutPage_zh_Hans.txt
-
-
- ILSpy 版本
-
-
- 有新的 ILSpy 版本已经可用。
-
-
- 缩进长度:
-
-
- 缩进
-
-
- 插入使用声明
-
-
- 是否删除选中的程序集列表?
-
-
- 已有同名的列表。
-
-
- 是否删除所有程序集列表,并重建默认程序集列表?
-
-
- 加载在最后一个实例中加载的程序集。
-
-
- 加载中...
-
-
- 位置
-
-
- 管理程序集列表
-
-
- 管理程序集列表(_L)...
-
-
- 杂项
-
-
- .NET 版本
-
-
- 名称
-
-
- 导航
-
-
- 导航失败,因为目标是隐藏的或编译器生成的类。\n
-请禁用所有的、可能隐藏它们的筛选器(例如,启用“视图 > 显示内部类型和成员”),并重试。
-
-
- 新建列表
-
-
- 新选项卡
-
-
- Nuget 包浏览器
-
-
- 确定
-
-
- 打开
-
-
- 打开资源管理器
-
-
- 从 GAC 中打开
-
-
- 从 GAC 中打开(_G)...
-
-
- 删除(_D)
-
-
- 打开(_O)
-
-
- 操作已取消。
-
-
- 选项
-
-
- 其他
-
-
- 其他选项
-
-
- 其他资源
-
-
- Portable PDB(*.pdb)|*.pdb|所有文件(*.*)|*.*
-
-
- 你可以切换 选项 > 反编译器 > 其他 > 使用新的 SDK 样式(*.csproj)生成项目文件 设置以改变项目格式。
-
-
- 已生成非 SDK 样式项目。 访问 https://docs.microsoft.com/zh-cn//nuget/resources/check-project-format 了解更多。
-
-
- 已生成 SDK 样式项目。 访问 https://docs.microsoft.com/zh-cn//nuget/resources/check-project-format 了解更多。
-
-
- 反编译程序集 {0} 失败,因为命名空间的名字过长或文件嵌套过深。
-如果你正在使用 Windows 10.0.14393 (Windows 10 version 1607) 或更新的版本,你可以通过在注册表 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" 中新建键值 “LongPathsEnabled”,并将其值设为 0x1,以启用 “长路径支持”
-如果你的系统已经支持长路径,但仍然出现这个问题。你可以尝试启用嵌套目录,你可以通过勾选 选项 > 反编译器 > 项目导出 > 为命名空间使用嵌套目录 复选框启用这项设置。这应该可以解决问题,因为即便是在支持长路径的平台,一个文件夹的名称长度仍然是有限的,在 Windows/NTFS 上该限制为 255 字符。
-
-
- 例如属性 getter/setter 访问。要获得最佳反编译结果,请手动将缺少的引用添加到加载的程序集列表中。
-
-
- 公钥标记
-
-
- 重命名(_E)
-
-
- 引用名称
-
-
- 引用
-
-
- 重新加载程序集
-
-
- 重新加载全部程序集
-
-
- 移除
-
-
- 删除死代码和无副作用的代码
-
-
- 移除文件资源管理器集成
-
-
- 这会在注册表的“HKCU\Software\Classes\dllfile\shell\Open with ILSpy\command”与“HKCU\Software\Classes\exefile\shell\Open with ILSpy\command”中移除“{0}”。
-
-确定继续?
-
-
- 重命名列表
-
-
- 还原到默认值
-
-
- 是否为活动页面加载默认值?
-
-
- 资源文件|*.resources|XML资源文件|*.resx
-
-
- 保存
-
-
- 保存代码
-
-
- 在此程序集中搜索
-
-
- 在此命名空间中搜索
-
-
- 搜索...
-
-
- 搜索已中止,发现超过1000个结果。
-
-
- 搜索(Ctrl + Shift + F 或 Ctrl + E)
-
-
- 搜索 Microsoft Docs...
-
-
- 搜索
-
-
- 搜索...
-
-
- 全部选择
-
-
- 选择要打开的程序集:
-
-
- 选择一个程序集列表
-
-
- 选择一个反编译目标语言
-
-
- 选择一个列表:
-
-
- 选择 PDB...
-
-
- 选择输出语言的版本
-
-
- 你必须重启ILSpy才能使得更改生效。
-
-
- Shell
-
-
- 显示所有类型和成员
-
-
- 显示程序集加载日志
-
-
- 在块中显示子索引
-
-
- 在反编译代码中显示 XML 文档
-
-
- 显示 IL 范围
-
-
- 显示调试符号的信息(如果可用)
-
-
- 显示内部类型和成员
-
-
- 显示行号
-
-
- 显示元数据标记
-
-
- 使用十进制显示元数据标记
-
-
- 只显示公有类型和成员
-
-
- 在每条 IL 指令前显示原始偏移量和字节
-
-
- 在此步骤之后显示状态
-
-
- 在此步骤之前显示状态
-
-
- 显示所有类型和成员(_A)
-
-
- 显示内部类型和成员(_I)
-
-
- 只显示公有类型和成员(_P)
-
-
- 大小:
-
-
- 按名称排列程序集列表
-
-
- 按名称排列程序集列表(_L)
-
-
- 排序结果自适应
-
-
- 就绪...
-
-
- 状态
-
-
- 字符串表
-
-
- 为窗口标题栏应用自定义样式
-
-
- Tab 长度:
-
-
- 主题
-
-
- 切换所有折叠
-
-
- 树视图选项
-
-
- 类型
-
-
- 语言
-
-
- 系统
-
-
- 找不到 ILSpy 的更新。
-
-
- 使用 fld 语法糖
-
-
- 使用 logic 语法糖
-
-
- 使用嵌套的命名空间结构
-
-
- 使用 Tab 替代空格
-
-
- 您使用的是最新版本。
-
-
- 您使用的是每日构建版本,比最新版本更新。
-
-
- 值
-
-
- 值(以字符串形式)
-
-
- 使用调试符号中的变量名称(如果可用)
-
-
- 版本
-
-
- 版本 {0} 已可用。
-
-
- 视图
-
-
- Visual Studio 解决方案文件(*.sln)|*.sln|所有文件(*.*)|*.*
-
-
- 警告:此程序集被标记为“引用程序集”,这意味着它只包含元数据,没有可执行代码。
-
-
- 警告:某些程序集引用无法自动解析。这可能会导致某些部分反编译错误,
-
-
- 搜索 t:类型、m:成员 或 c:常量;使用完全匹配(=term)、不应包含(-term)或必须包含(+term);使用 /正(则)?表达(式)?/;或同时使用二者 - t:/类(型)?/...
-
-
- 关闭所有文档(_C)
-
-
- 重置布局(_R)
-
-
- 关于(_A)
-
-
- 添加到主列表(_A)
-
-
- 分析器(_A)
-
-
- 程序集(_A)
-
-
- 检查更新(_C)
-
-
- 折叠所有树节点(_C)
-
-
- 文件(_F)
-
-
- 帮助(_H)
-
-
- 加载依赖(_L)
-
-
- 新建(_N)
-
-
- 打开(_O)...
-
-
- 在这里打开命令行(_O)
-
-
- 打开包含文件夹(_O)
-
-
- 选项(_O)...
-
-
- 重新加载(_R)
-
-
- 移除(_R)
-
-
- 移除程序集及其加载错误(_R)
-
-
- 重置(_R)
-
-
- 资源
-
-
- 保存代码(_S)...
-
-
- 搜索(_S):
-
-
- 搜索(_S):
-
-
- 显示调试步骤(_S)
-
-
- 切换折叠
-
-
- 视图(_V)
-
-
- 窗口(_W)
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 关于
+
+
+ 添加预配置列表...
+
+
+ 添加文件资源管理器集成
+
+
+ 这会在注册表的“HKCU\Software\Classes\dllfile\shell\Open with ILSpy\command”与“HKCU\Software\Classes\exefile\shell\Open with ILSpy\command”中添加“{0}”。这样在文件资源管理器中,.dll 文件与 .exe 文件可以在右键菜单中使用 ILSpy 打开。
+
+确定继续?
+
+
+ |所有文件|*.*
+
+
+ 允许多个实例
+
+
+ 始终使用大括号
+
+
+ 分析
+
+
+ 程序集
+
+
+ 程序集
+
+
+ 目录非空。文件会被覆盖。
+确定继续?
+
+
+ 项目目录非空
+
+
+ 每周自动检查更新
+
+
+ 后退
+
+
+ 基类型
+
+
+ 克隆(_L)
+
+
+ 取消
+
+
+ 无法解析实体。可能是由于缺少程序集引用。请添加缺少的程序集并重试。
+
+
+ 无法创建为{0}创建PDB文件,因为它不包含PE调试目录类型 'CodeView'.
+
+
+ 再次检查
+
+
+ 检查更新
+
+
+ 检查...
+
+
+ 关闭
+
+
+ 折叠所有树节点
+
+
+ 复制
+
+
+ 复制错误信息
+
+
+ 复制完全限定名称
+
+
+ 无法使用SDK-style项目格式,因为发现有不兼容目标框架别名。
+
+
+ 创建
+
+
+ 区域
+
+
+ 调试 -- 全部反编译到 C#
+
+
+ 调试 -- 反编译100次
+
+
+ 调试 -- 全部反编译到 IL
+
+
+ 调试 -- PDB 转储为 XML
+
+
+ 调试步骤
+
+
+ 调试此步骤
+
+
+ 反编译完成。耗时 {0:F1} 秒。
+
+
+ 反编译视图选项
+
+
+ 反编译已取消。
+
+
+ 反编译
+
+
+ 在新选项卡反编译
+
+
+ 反编译器
+
+
+ 如果可能,始终内联局部变量
+
+
+ 允许使用 Add 扩展方法的集合初始化器表达式
+
+
+ 使用 ref 扩展方法
+
+
+ 始终强制转换显式接口实现调用的目标
+
+
+
+
+
+ 始终限定成员引用
+
+
+ 始终显示枚举数值
+
+
+ 始终使用大括号
+
+
+ 总是使用 "global::" 完全限定命名空间
+
+
+ 在已加载的程序集上应用 Windows 运行时投影
+
+
+ 数组初始化器表达式
+
+
+ 反编译异步 IAsyncEnumerator 方法
+
+
+
+
+
+ 反编译匿名方法或 lambda
+
+
+ 反编译匿名类型
+
+
+ 反编译异步方法
+
+
+ 反编译自动事件
+
+
+ 反编译自动属性
+
+
+ 反编译 catch/finally 内的 await
+
+
+ 反编译 C# 1.0“public unsafe fixed int arr[10];”成员
+
+
+ 反编译 [DecimalConstant(...)] 作为简单的字面值
+
+
+ 反编译枚举器(yield return)
+
+
+ 反编译表达树
+
+
+ 反编译使用 GetEnumerator 扩展方法的 foreach 语句
+
+
+
+
+
+ 反编译 dynamic 类型
+
+
+ 检测解构赋值
+
+
+ 检测使用了 await 的 using 和 foreach 块
+
+
+ 检测 foreach 语句
+
+
+ 检测 lock 语句
+
+
+ 检测字符串 switch 语句
+
+
+ 检测元组比较
+
+
+ 检测 using 语句
+
+
+ Dictionary 初始值设定项表达式
+
+
+ 如果可能,转换到 do-while 块
+
+
+ F# 特定选项
+
+
+ 使用文件作用域命名空间表达式 (File-scoped namespace)
+
+
+ 如果可能,转换到 for 块
+
+
+ 函数指针
+
+
+ 反编译 getter-only 自动属性
+
+
+ 在反编译代码中包括 XML 文档注释
+
+
+ 允许 init; 访问器
+
+
+ 插入 using 声明
+
+
+ 引入局部函数(local functions)
+
+
+
+
+
+ 引入静态局部函数(static local functions)
+
+
+ IsByRefLikeAttribute 应替换为结构上的 ref 修饰符
+
+
+ IsReadOnlyAttribute 应替为结构参数上的 readonly/in 中的修饰符
+
+
+ 类型参数上的 IsUnmanagedAttribute 应替换为 unmanaged 约束
+
+
+ 'scoped' 生命周期注解关键字
+
+
+ 使用 nint/nuint 类型
+
+
+ 反编译 ?. 和 ?[] 运算符
+
+
+ 可空引用类型
+
+
+ 对象或集合初始化器表达式
+
+
+ 其他
+
+
+ 使用模式匹配表达式
+
+
+ 项目导出
+
+
+ 范围(ranges)
+
+
+ 只读方法
+
+
+ 记录
+
+
+ 记录结构
+
+
+ 删除死代码和无副作用的代码(请谨慎使用)
+
+
+ 删除死值(请谨慎使用)
+
+
+ 如果可能,删除可选参数
+
+
+ Required 必要成员
+
+
+ 如果可能,分离局部变量的声明与初始化(int x = 5; -> int x; x = 5;)
+
+
+ 显示调试符号中的信息(如果可用)
+
+
+
+
+
+ 检测整型 switch 即使 IL 代码不使用跳转表
+
+
+ 反编译 'string.Concat(a, b)' 调用为 'a + b'
+
+
+ switch 表达式
+
+
+ 使用弃元
+
+
+ 使用增强的 using 变量声明
+
+
+ 对仅有 getter 访问器的属性使用 Expression-bodied 成员语法
+
+
+ 使用扩展方法语法
+
+
+ 在元组类型之间使用隐式转换
+
+
+ 使用隐式方法组转换
+
+
+ 使用 LINQ 表达式语法
+
+
+ 如果可能, 请使用 lambda 语法
+
+
+ 对可为空类型使用提升运算符
+
+
+ 使用命名参数
+
+
+ 为命名空间使用嵌套目录
+
+
+ 使用非尾随命名参数
+
+
+
+
+
+ 使用 out 变量声明
+
+
+ 使用基于模式的 fixed 语句
+
+
+ 使用带有记录的主构造器语法
+
+
+
+
+
+ 使用 ref 局部变量以准确表达求值顺序
+
+
+ 使用新的 SDK 样式(*.csproj)生成项目文件
+
+
+ 使用 stackalloc 初始化器语法
+
+
+ 使用字符串内插
+
+
+ 使用 throw 表达式
+
+
+ 使用元组类型语法
+
+
+ 使用调试符号中的变量名(如果可用)
+
+
+ VB 特定选项
+
+
+ 'with' 初始化器表达式
+
+
+ 下面选择的设置将与语言下拉列表中的选择一起应用于反编译程序输出。在下拉列表中选择较低的语言版本将停用较高版本的所有选定选项。请注意, 某些设置隐式依赖于彼此, 例如: 如果不首先将静态调用转换为扩展方法调用, 则无法引入 LINQ 表达式。
+
+
+ 正在反编译...
+
+
+ 依赖(_L)
+
+
+ 派生类型
+
+
+ 显示
+
+
+ 显示代码
+
+
+ 字体:
+
+
+ 主题:
+
+
+ 下载
+
+
+ 退出(_X)
+
+
+ 编辑器
+
+
+ 在大括号中的所有块上启用折叠
+
+
+ 启用自动换行
+
+
+ 输入列表名称:
+
+
+ 退出
+
+
+ 在反编译后展开成员定义
+
+
+ 反编译后展开引用和声明
+
+
+ 提取所有包条目
+
+
+ 提取包条目
+
+
+ 折叠
+
+
+ 字体
+
+
+ 前进
+
+
+ 生成 Portable PDB
+
+
+ 生成完成,耗时 {0} 秒。
+
+
+ 已取消生成。
+
+
+ 转至令牌
+
+
+ 在树视图中隐藏空的元数据表
+
+
+ 高亮当前行
+
+
+ 高亮配对的大括号
+
+
+ ILSpyAboutPage_zh_Hans.txt
+
+
+ ILSpy 版本
+
+
+ 有新的 ILSpy 版本已经可用。
+
+
+ 缩进长度:
+
+
+ 缩进
+
+
+ 插入使用声明
+
+
+ 是否删除选中的程序集列表?
+
+
+ 已有同名的列表。
+
+
+ 是否删除所有程序集列表,并重建默认程序集列表?
+
+
+ 加载在最后一个实例中加载的程序集。
+
+
+ 加载中...
+
+
+ 位置
+
+
+ 管理程序集列表
+
+
+ 管理程序集列表(_L)...
+
+
+ 杂项
+
+
+ .NET 版本
+
+
+ 名称
+
+
+ 导航
+
+
+ 导航失败,因为目标是隐藏的或编译器生成的类。\n
+请禁用所有的、可能隐藏它们的筛选器(例如,启用“视图 > 显示内部类型和成员”),并重试。
+
+
+ 新建列表
+
+
+ 新选项卡
+
+
+ Nuget 包浏览器
+
+
+ 确定
+
+
+ 打开
+
+
+ 打开资源管理器
+
+
+ 从 GAC 中打开
+
+
+ 从 GAC 中打开(_G)...
+
+
+ 删除(_D)
+
+
+ 打开(_O)
+
+
+ 操作已取消。
+
+
+ 选项
+
+
+ 其他
+
+
+ 其他选项
+
+
+ 其他资源
+
+
+ Portable PDB(*.pdb)|*.pdb|所有文件(*.*)|*.*
+
+
+ 你可以切换 选项 > 反编译器 > 其他 > 使用新的 SDK 样式(*.csproj)生成项目文件 设置以改变项目格式。
+
+
+ 已生成非 SDK 样式项目。 访问 https://docs.microsoft.com/zh-cn//nuget/resources/check-project-format 了解更多。
+
+
+ 已生成 SDK 样式项目。 访问 https://docs.microsoft.com/zh-cn//nuget/resources/check-project-format 了解更多。
+
+
+ 反编译程序集 {0} 失败,因为命名空间的名字过长或文件嵌套过深。
+如果你正在使用 Windows 10.0.14393 (Windows 10 version 1607) 或更新的版本,你可以通过在注册表 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" 中新建键值 “LongPathsEnabled”,并将其值设为 0x1,以启用 “长路径支持”
+如果你的系统已经支持长路径,但仍然出现这个问题。你可以尝试启用嵌套目录,你可以通过勾选 选项 > 反编译器 > 项目导出 > 为命名空间使用嵌套目录 复选框启用这项设置。这应该可以解决问题,因为即便是在支持长路径的平台,一个文件夹的名称长度仍然是有限的,在 Windows/NTFS 上该限制为 255 字符。
+
+
+ 例如属性 getter/setter 访问。要获得最佳反编译结果,请手动将缺少的引用添加到加载的程序集列表中。
+
+
+ 公钥标记
+
+
+ 重命名(_E)
+
+
+ 引用名称
+
+
+ 引用
+
+
+ 重新加载程序集
+
+
+ 重新加载全部程序集
+
+
+ 移除
+
+
+ 删除死代码和无副作用的代码
+
+
+ 移除文件资源管理器集成
+
+
+ 这会在注册表的“HKCU\Software\Classes\dllfile\shell\Open with ILSpy\command”与“HKCU\Software\Classes\exefile\shell\Open with ILSpy\command”中移除“{0}”。
+
+确定继续?
+
+
+ 重命名列表
+
+
+ 还原到默认值
+
+
+ 是否为活动页面加载默认值?
+
+
+ 资源文件|*.resources|XML资源文件|*.resx
+
+
+ 保存
+
+
+ 保存代码
+
+
+ 在此程序集中搜索
+
+
+ 在此命名空间中搜索
+
+
+ 搜索...
+
+
+ 搜索已中止,发现超过1000个结果。
+
+
+ 搜索(Ctrl + Shift + F 或 Ctrl + E)
+
+
+ 搜索 Microsoft Docs...
+
+
+ 搜索
+
+
+ 搜索...
+
+
+ 全部选择
+
+
+ 选择要打开的程序集:
+
+
+ 选择一个程序集列表
+
+
+ 选择一个反编译目标语言
+
+
+ 选择一个列表:
+
+
+ 选择 PDB...
+
+
+ 选择输出语言的版本
+
+
+ 你必须重启ILSpy才能使得更改生效。
+
+
+ Shell
+
+
+ 显示所有类型和成员
+
+
+ 显示程序集加载日志
+
+
+ 在块中显示子索引
+
+
+ 在反编译代码中显示 XML 文档
+
+
+ 显示 IL 范围
+
+
+ 显示调试符号的信息(如果可用)
+
+
+ 显示内部类型和成员
+
+
+ 显示行号
+
+
+ 显示元数据标记
+
+
+ 使用十进制显示元数据标记
+
+
+ 只显示公有类型和成员
+
+
+ 在每条 IL 指令前显示原始偏移量和字节
+
+
+ 在此步骤之后显示状态
+
+
+ 在此步骤之前显示状态
+
+
+ 显示所有类型和成员(_A)
+
+
+ 显示内部类型和成员(_I)
+
+
+ 只显示公有类型和成员(_P)
+
+
+ 大小:
+
+
+ 按名称排列程序集列表
+
+
+ 按名称排列程序集列表(_L)
+
+
+ 排序结果自适应
+
+
+ 就绪...
+
+
+ 状态
+
+
+ 字符串表
+
+
+ 为窗口标题栏应用自定义样式
+
+
+ Tab 长度:
+
+
+ 主题
+
+
+ 切换所有折叠
+
+
+ 树视图选项
+
+
+ 类型
+
+
+ 语言
+
+
+ 系统
+
+
+ 找不到 ILSpy 的更新。
+
+
+ 使用 fld 语法糖
+
+
+ 使用 logic 语法糖
+
+
+ 使用嵌套的命名空间结构
+
+
+ 使用 Tab 替代空格
+
+
+ 您使用的是最新版本。
+
+
+ 您使用的是每日构建版本,比最新版本更新。
+
+
+ 值
+
+
+ 值(以字符串形式)
+
+
+ 使用调试符号中的变量名称(如果可用)
+
+
+ 版本
+
+
+ 版本 {0} 已可用。
+
+
+ 视图
+
+
+ Visual Studio 解决方案文件(*.sln)|*.sln|所有文件(*.*)|*.*
+
+
+ 警告:此程序集被标记为“引用程序集”,这意味着它只包含元数据,没有可执行代码。
+
+
+ 警告:某些程序集引用无法自动解析。这可能会导致某些部分反编译错误,
+
+
+ 搜索 t:类型、m:成员 或 c:常量;使用完全匹配(=term)、不应包含(-term)或必须包含(+term);使用 /正(则)?表达(式)?/;或同时使用二者 - t:/类(型)?/...
+
+
+ 关闭所有文档(_C)
+
+
+ 重置布局(_R)
+
+
+ 关于(_A)
+
+
+ 添加到主列表(_A)
+
+
+ 分析器(_A)
+
+
+ 程序集(_A)
+
+
+ 检查更新(_C)
+
+
+ 折叠所有树节点(_C)
+
+
+ 文件(_F)
+
+
+ 帮助(_H)
+
+
+ 加载依赖(_L)
+
+
+ 新建(_N)
+
+
+ 打开(_O)...
+
+
+ 在这里打开命令行(_O)
+
+
+ 打开包含文件夹(_O)
+
+
+ 选项(_O)...
+
+
+ 重新加载(_R)
+
+
+ 移除(_R)
+
+
+ 移除程序集及其加载错误(_R)
+
+
+ 重置(_R)
+
+
+ 资源
+
+
+ 保存代码(_S)...
+
+
+ 搜索(_S):
+
+
+ 搜索(_S):
+
+
+ 显示调试步骤(_S)
+
+
+ 切换折叠
+
+
+ 视图(_V)
+
+
+ 窗口(_W)
+
\ No newline at end of file
diff --git a/doc/third-party-notices.txt b/doc/third-party-notices.txt
index e2c72c3c28..ea7ce78754 100644
--- a/doc/third-party-notices.txt
+++ b/doc/third-party-notices.txt
@@ -498,6 +498,32 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+License Notice for Spectre.Console (part of ILSpyCmd)
+---------------------------
+
+https://github.com/spectreconsole/spectre.console/blob/main/LICENSE.md
+
+MIT License
+
+Copyright (c) 2020 Patrik Svensson, Phil Scott, Nils Andresen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
License Notice for Tom's Toolbox (part of ILSpy)
---------------------------