void TestSplitArgsManaged(string line)
        {
            var unmanaged = CmdLineToArgvW.SplitArgs(line);
            var managed   = CmdLineToArgvW.SplitArgsManaged(line);

            Trace.WriteLine(line);
            TraceArray(unmanaged, nameof(unmanaged));
            TraceArray(managed, nameof(managed));

            Assert.AreEqual(unmanaged.Length, managed.Length);
            for (int i = 0; i < unmanaged.Length; i++)
            {
                Assert.AreEqual(unmanaged[i], managed[i]);
            }
        }
        public bool Execute(string[] args, int argsStartIndex)
        {
            Console.WriteLine("Starting console...");
            Win32Helper.AllocConsole();
            IntPtr         stdHandle      = Win32Helper.GetStdHandle(Win32Helper.STD_OUTPUT_HANDLE);
            SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle, true);
            FileStream     fileStream     = new FileStream(safeFileHandle, FileAccess.Write);
            Encoding       encoding       = System.Text.Encoding.GetEncoding(Win32Helper.MY_CODE_PAGE);
            StreamWriter   standardOutput = new StreamWriter(fileStream, encoding);

            standardOutput.AutoFlush = true;
            Console.SetOut(standardOutput);

            Console.WriteLine("Console started.");
            Console.WriteLine($"Type '{end}' any time to exit the console.'");

            //Any arguments that comes after the 'console' command name are interpreted as
            //a new command line that should be executed in the console.
            //This behavior helps when wanting to start the UI in console mode.
            //In this case then we call the program like this:
            //enco.exe console showui
            //This will start the console and then directly execute the command 'showui' from inside it.
            //Thus, we start the console and then the UI from a single command line.

            string allAfterArgs = string.Empty;

            for (int i = argsStartIndex; i < args.Length; i++)
            {
                allAfterArgs += args[i];
            }
            if (allAfterArgs != String.Empty)
            {
                Console.WriteLine(allAfterArgs);
                args.ProcessCommandLine(Program.GetCommands, null, argsStartIndex);
            }

            args = new string[1];
            while (true)
            {
                string read = Console.ReadLine();

                if (read == null || read.Trim().ToLower() == end)
                {
                    break;
                }

                try
                {
                    args = CmdLineToArgvW.SplitArgs(read);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Couldn't convert the given line '{read}' to argument!");
                    Console.WriteLine(ex.Message);
                    Console.WriteLine($"Please try again, or type '{end}' to exit.");
                    continue;
                }
                if (args == null)
                {
                    Console.WriteLine("Please enter a command name.");
                }
                else
                {
                    args.ProcessCommandLine(Program.GetCommands, null);
                }
                //if (args.ProcessCommandLine(Program.GetCommands, null))
                //    {
                //    break;
                //}
            }
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
            Console.WriteLine("Ending console.");
            return(true);
        }