From d0c443cae1f0569673e987a99a884b2eeac89e3f Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Sat, 4 May 2024 08:28:24 +0200 Subject: [PATCH] Switch to --newinstance --- ILSpy.Tests/CommandLineArgumentsTests.cs | 13 +---- ILSpy/CommandLineArguments.cs | 33 ++--------- doc/Command Line.txt | 73 ++++++++---------------- 3 files changed, 32 insertions(+), 87 deletions(-) diff --git a/ILSpy.Tests/CommandLineArgumentsTests.cs b/ILSpy.Tests/CommandLineArgumentsTests.cs index 3b60fd7161..0d6626d9c4 100644 --- a/ILSpy.Tests/CommandLineArgumentsTests.cs +++ b/ILSpy.Tests/CommandLineArgumentsTests.cs @@ -22,19 +22,12 @@ public void VerifyEmptyArgumentsArray() } [Test] - public void VerifySeparateOption() + public void VerifyForceNewInstanceOption() { - var cmdLineArgs = new CommandLineArguments(new string[] { "--instancing", "Multi" }); + var cmdLineArgs = new CommandLineArguments(new string[] { "--newinstance" }); cmdLineArgs.SingleInstance.Should().BeFalse(); } - [Test] - public void VerifySingleInstanceOption() - { - var cmdLineArgs = new CommandLineArguments(new string[] { "--instancing", "Single" }); - cmdLineArgs.SingleInstance.Should().BeTrue(); - } - [Test] public void VerifyNavigateToOption() { @@ -86,7 +79,7 @@ public void PassAtFileArgumentsSpaceSeparated() { string filepath = System.IO.Path.GetTempFileName(); - System.IO.File.WriteAllText(filepath, "assembly1 assembly2 assembly3 --instancing multi --noactivate"); + System.IO.File.WriteAllText(filepath, "assembly1 assembly2 assembly3 --newinstance --noactivate"); var cmdLineArgs = new CommandLineArguments(new string[] { $"@{filepath}" }); diff --git a/ILSpy/CommandLineArguments.cs b/ILSpy/CommandLineArguments.cs index da46ed8838..7822743bb3 100644 --- a/ILSpy/CommandLineArguments.cs +++ b/ILSpy/CommandLineArguments.cs @@ -18,18 +18,11 @@ using McMaster.Extensions.CommandLineUtils; -using System; using System.Collections.Generic; using System.Linq; namespace ICSharpCode.ILSpy { - internal enum InstancingMode - { - Single, - Multi - } - sealed class CommandLineArguments { // see /doc/Command Line.txt for details @@ -44,12 +37,13 @@ sealed class CommandLineArguments public CommandLineArguments(IEnumerable arguments) { var app = new CommandLineApplication() { + // https://natemcmaster.github.io/CommandLineUtils/docs/response-file-parsing.html?tabs=using-attributes ResponseFileHandling = ResponseFileHandling.ParseArgsAsSpaceSeparated, }; - var oInstancing = app.Option("-i|--instancing ", - "Single or multi instance", - CommandOptionType.SingleValue); + var oForceNewInstance = app.Option("--newinstance", + "Start a new instance of ILSpy even if the user configuration is set to single-instance", + CommandOptionType.NoValue); var oNavigateTo = app.Option("-n|--navigateto ", "Navigates to the member specified by the given ID string.\r\nThe member is searched for only in the assemblies specified on the command line.\r\nExample: 'ILSpy ILSpy.exe --navigateTo:T:ICSharpCode.ILSpy.CommandLineArguments'", @@ -79,26 +73,11 @@ public CommandLineArguments(IEnumerable arguments) // To enable this, MultipleValues must be set to true, and the argument must be the last one specified. var files = app.Argument("Assemblies", "Assemblies to load", multipleValues: true); - // string helptext = app.GetHelpText(); - app.Parse(arguments.ToArray()); - if (oInstancing.Value != null) - { - if (Enum.TryParse(oInstancing.Value(), true, out var mode)) - { - switch (mode) - { - case InstancingMode.Single: - SingleInstance = true; - break; - case InstancingMode.Multi: - SingleInstance = false; - break; - } - } - } + if (oForceNewInstance.HasValue()) + SingleInstance = false; NavigateTo = oNavigateTo.ParsedValue; Search = oSearch.ParsedValue; diff --git a/doc/Command Line.txt b/doc/Command Line.txt index 1cc041d66b..05b6521a59 100644 --- a/doc/Command Line.txt +++ b/doc/Command Line.txt @@ -1,54 +1,27 @@ ILSpy Command Line Arguments -Command line arguments can be either options or file names. -If an argument is a file name, the file will be opened as assembly and added to the current assembly list. +Usage: [options] + @ResponseFile.rsp -Available options: - /singleInstance If ILSpy is already running, activates the existing instance - and passes command line arguments to that instance. - This is the default value if /list is not used. - - /separate Start up a separate ILSpy instance even if it is already running. - - /noActivate Do not activate the existing ILSpy instance. This option has no effect - if a new ILSpy instance is being started. - - /list:listname Specifies the name of the assembly list that is loaded initially. - When this option is not specified, ILSpy loads the previously opened list. - Specify "/list" (without value) to open the default list. - - When this option is used, ILSpy will activate an existing instance - only if it uses the same list as specified. - - [Note: Assembly Lists are not yet implemented] - - /clearList Clears the assembly list before loading the specified assemblies. - [Note: Assembly Lists are not yet implemented] - - /navigateTo:tag Navigates to the member specified by the given ID string. - The member is searched for only in the assemblies specified on the command line. - Example: 'ILSpy ILSpy.exe /navigateTo:T:ICSharpCode.ILSpy.CommandLineArguments' - - The syntax of ID strings is described in appendix A of the C# language specification. - - /language:name Selects the specified language. - Example: 'ILSpy /language:C#' or 'ILSpy /language:IL' +Arguments: + Assemblies Assemblies to load -WM_COPYDATA (SendMessage API): - ILSpy can be controlled by other programs that send a WM_COPYDATA message to its main window. - The message data must be an Unicode (UTF-16) string starting with "ILSpy:\r\n". - All lines except the first ("ILSpy:") in that string are handled as command-line arguments. - There must be exactly one argument per line. - - That is, by sending this message: - ILSpy: - C:\Assembly.dll - /navigateTo:T:Type - The target ILSpy instance will open C:\Assembly.dll and navigate to the specified type. - - ILSpy will return TRUE (1) if it handles the message, and FALSE (0) otherwise. - The /separate option will be ignored; WM_COPYDATA will never start up a new instance. - The /noActivate option has no effect, sending WM_COPYDATA will never activate the window. - Instead, the calling process should use SetForegroundWindow(). - If you use /list with WM_COPYDATA, you need to specify /singleInstance as well, otherwise - ILSpy will not handle the message if it has opened a different assembly list. +Options: + --newinstance Start a new instance of ILSpy even if the user configuration is set to single-instance + -n|--navigateto Navigates to the member specified by the given ID string. + The member is searched for only in the assemblies specified on the command line. + Example: 'ILSpy ILSpy.exe --navigateTo:T:ICSharpCode.ILSpy.CommandLineArguments' + -s|--search 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)?/... + -l|--language Selects the specified language. + Example: 'ILSpy --language:C#' or 'ILSpy --language:IL' + -c|--config Provide a specific configuration file. + Example: 'ILSpy --config:myconfig.xml' + --noactivate Do not activate the existing ILSpy instance. + This option has no effect if a new ILSpy instance is being started. + +Note on @ResponseFile.rsp: + +* The response file should contain the arguments as if they were passed on the command line (space-separated). +* Use it when the list of assemblies is too long to fit on the command line. \ No newline at end of file