diff --git a/src/libraries/System.Diagnostics.Process/ref/System.Diagnostics.Process.cs b/src/libraries/System.Diagnostics.Process/ref/System.Diagnostics.Process.cs index ed06fe1dc1ca86..bd58edc786fba1 100644 --- a/src/libraries/System.Diagnostics.Process/ref/System.Diagnostics.Process.cs +++ b/src/libraries/System.Diagnostics.Process/ref/System.Diagnostics.Process.cs @@ -215,6 +215,7 @@ public sealed partial class ProcessStartInfo public ProcessStartInfo() { } public ProcessStartInfo(string fileName) { } public ProcessStartInfo(string fileName, string arguments) { } + public ProcessStartInfo(string fileName, System.Collections.Generic.IEnumerable arguments) { } public System.Collections.ObjectModel.Collection ArgumentList { get { throw null; } } [System.Diagnostics.CodeAnalysis.AllowNullAttribute] public string Arguments { get { throw null; } set { } } diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.cs index f62778b8735cb2..ca030f0bb12482 100644 --- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.cs +++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.cs @@ -1327,16 +1327,7 @@ public static Process Start(string fileName, string arguments) [SupportedOSPlatform("maccatalyst")] public static Process Start(string fileName, IEnumerable arguments) { - ArgumentNullException.ThrowIfNull(fileName); - ArgumentNullException.ThrowIfNull(arguments); - - var startInfo = new ProcessStartInfo(fileName); - foreach (string argument in arguments) - { - startInfo.ArgumentList.Add(argument); - } - - return Start(startInfo)!; + return Start(new ProcessStartInfo(fileName, arguments))!; } /// diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/ProcessStartInfo.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/ProcessStartInfo.cs index b2941f17dfd5aa..888c4cec0de629 100644 --- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/ProcessStartInfo.cs +++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/ProcessStartInfo.cs @@ -55,6 +55,19 @@ public ProcessStartInfo(string fileName, string arguments) _arguments = arguments; } + /// + /// Specifies the name of the application that is to be started, as well as a set + /// of command line arguments to pass to the application. + /// + public ProcessStartInfo(string fileName, IEnumerable arguments) + { + ArgumentNullException.ThrowIfNull(fileName); + ArgumentNullException.ThrowIfNull(arguments); + + _fileName = fileName; + _argumentList = new Collection(new List(arguments)); + } + /// /// Specifies the set of command line arguments to use when starting the application. /// diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs index 686780fd018d72..2370d07afbfbfb 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs @@ -1257,15 +1257,33 @@ public void UninitializedArgumentList() } [Fact] - public void InitializeWithArgumentList() + public void InitializeWithArgumentList_Add() { ProcessStartInfo psi = new ProcessStartInfo("filename"); - psi.ArgumentList.Add("arg1"); - psi.ArgumentList.Add("arg2"); - Assert.Equal(2, psi.ArgumentList.Count); - Assert.Equal("arg1", psi.ArgumentList[0]); - Assert.Equal("arg2", psi.ArgumentList[1]); + string[] args = new[] { "arg1", "arg2", " arg3", "arg4 ", "arg 5", $"arg{Environment.NewLine}6" }; + foreach (string arg in args) + { + psi.ArgumentList.Add(arg); + } + + Assert.Equal(args, psi.ArgumentList); + } + + [Fact] + public void InitializeWithArgumentList_Enumerable() + { + string[] args = new[] { "arg1", "arg2", " arg3", "arg4 ", "arg 5", $"arg{Environment.NewLine}6" }; + ProcessStartInfo psi = new ProcessStartInfo("filename", args); + + Assert.Equal(args, psi.ArgumentList); + } + + [Fact] + public void InitializeWithArgumentList_ThrowsArgumentNullException() + { + Assert.Throws("fileName", () => new ProcessStartInfo(null, new[] { "a", "b" })); + Assert.Throws("arguments", () => new ProcessStartInfo("a", (IEnumerable)null)); } [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotWindowsNanoServer))] // No Notepad on Nano diff --git a/src/libraries/System.Runtime.Extensions/tests/System/Environment.Exit.cs b/src/libraries/System.Runtime.Extensions/tests/System/Environment.Exit.cs index aa1a0d110930bb..063de534bf765b 100644 --- a/src/libraries/System.Runtime.Extensions/tests/System/Environment.Exit.cs +++ b/src/libraries/System.Runtime.Extensions/tests/System/Environment.Exit.cs @@ -45,11 +45,8 @@ public static void ExitCode_VoidMainAppReturnsSetValue(int mode) { int expectedExitCode = 123; const string AppName = "VoidMainWithExitCodeApp.exe"; - var psi = new ProcessStartInfo(); - psi.FileName = RemoteExecutor.HostRunner; - psi.Arguments = $"{AppName} {expectedExitCode} {mode}"; - using (Process p = Process.Start(psi)) + using (Process p = Process.Start(RemoteExecutor.HostRunner, new[] { AppName, expectedExitCode.ToString(), mode.ToString() })) { p.WaitForExit(); Assert.Equal(expectedExitCode, p.ExitCode); diff --git a/src/tests/Loader/binding/tracing/BinderTracingTest.cs b/src/tests/Loader/binding/tracing/BinderTracingTest.cs index 697a830b69f5df..a48e3ab419dde4 100644 --- a/src/tests/Loader/binding/tracing/BinderTracingTest.cs +++ b/src/tests/Loader/binding/tracing/BinderTracingTest.cs @@ -190,10 +190,8 @@ private static bool RunSingleTest(MethodInfo method) private static bool RunTestInSeparateProcess(MethodInfo method) { - var startInfo = new ProcessStartInfo() + var startInfo = new ProcessStartInfo(Process.GetCurrentProcess().MainModule.FileName, new[] { Assembly.GetExecutingAssembly().Location, method.Name }) { - FileName = Process.GetCurrentProcess().MainModule.FileName, - Arguments = $"{Assembly.GetExecutingAssembly().Location} {method.Name}", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true