public static ProcessStartInfo Create( string name, string args, string?workingDirectory = null, bool captureOutput = true, string?windowsName = null, string?windowsArgs = null, Action <IDictionary <string, string> >?configureEnvironment = null) { var isWindows = FeatureDetector.IsWindows(); var startInfo = new ProcessStartInfo { FileName = isWindows ? (windowsName ?? name) : name, Arguments = isWindows ? (windowsArgs ?? args) : args, WorkingDirectory = workingDirectory ?? Environment.CurrentDirectory, UseShellExecute = false, RedirectStandardError = captureOutput, RedirectStandardOutput = captureOutput, //On windows dotnet core seams to set the codepage to 850 //see: https://github.com/dotnet/runtime/issues/17849#issuecomment-353612399 StandardOutputEncoding = isWindows ? Encoding.GetEncoding(850) //DOS-Latin-1 : Encoding.Default, }; configureEnvironment?.Invoke(startInfo.Environment); return(startInfo); }
private static async Task <Stream> CreateStream(Uri connectionString, CancellationToken token = default) { _ = connectionString ?? throw new ArgumentNullException(nameof(connectionString)); var serverName = FeatureDetector.IsWindows() ? connectionString.Host : "."; // TODO: write a connection string parser once we introduce the next transport var connectionId = connectionString.Segments[1]; var stream = new NamedPipeClientStream(serverName, connectionId, PipeDirection.InOut, PipeOptions.Asynchronous); await stream.ConnectAsync(token).ConfigureAwait(false); return(stream); }