将字符串转换为字符串数组以获取命令行参数

时间:2014-10-16 08:07:11

标签: c# string command-line-arguments arrays

我的字符串格式如下:

"arg1" "arg2" "arg3" ... "argx"

我将使用此字符串作为我的程序命令行参数的string[]。 如何将此字符串转换为字符串数组?

2 个答案:

答案 0 :(得分:0)

使用String.Split方法拆分原始字符串上的字符串。

如果你还需要删除引号,你可以遍历结果数组并获得不带引号的子串

或者您可以使用Regex.Split一次性完成。

答案 1 :(得分:0)

自己实现所有逃避并不容易,特别是CLR为你做的事情。

所以,你最好看看CLR来源。 It mentions CommandLineToArgvW api,其中包含nice documentation

但我们是C#家伙,必须search this function signature here。幸运的是,它有一个很好的样本(我的造型):

internal static class CmdLineToArgvW
{
    public static string[] SplitArgs(string unsplitArgumentLine)
    {
        int numberOfArgs;
        var ptrToSplitArgs = CommandLineToArgvW(unsplitArgumentLine, out numberOfArgs);
        // CommandLineToArgvW returns NULL upon failure.
        if (ptrToSplitArgs == IntPtr.Zero)
            throw new ArgumentException("Unable to split argument.", new Win32Exception());
        // Make sure the memory ptrToSplitArgs to is freed, even upon failure.
        try
        {
            var splitArgs = new string[numberOfArgs];
            // ptrToSplitArgs is an array of pointers to null terminated Unicode strings.
            // Copy each of these strings into our split argument array.
            for (var i = 0; i < numberOfArgs; i++)
                splitArgs[i] = Marshal.PtrToStringUni(
                    Marshal.ReadIntPtr(ptrToSplitArgs, i * IntPtr.Size));
            return splitArgs;
        }
        finally
        {
            // Free memory obtained by CommandLineToArgW.
            LocalFree(ptrToSplitArgs);
        }
    }
    [DllImport("shell32.dll", SetLastError = true)]
    private static extern IntPtr CommandLineToArgvW(
        [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine,
        out int pNumArgs);
    [DllImport("kernel32.dll")]
    private static extern IntPtr LocalFree(IntPtr hMem);
}

PS。注意,该可执行文件名应该是该行中的第一个参数。