把一个把字符串分解成命令行参数是很常见的操作,一直很纳闷为什么.net没有提供相关的功能,自己写一个又觉得麻烦。幸好windows提供了一个API来干这个事情。不过这个API调用起来颇为麻烦,google了一下才找到方法。代码贴上来,方便后来人使用。
代码如下:
using System;
using System.Runtime.InteropServices;
using System.Text;
/// <summary>using System.Runtime.InteropServices;
using System.Text;
/// string extension for split command line to string[]
/// </summary>
public static class CmdLineExtension
{
public static string[] SplitArgs(this string cmd)
{
int count;
var ret = CommandLineToArgvW(cmd, out count);
if(ret == IntPtr.Zero)
throw new ArgumentException("Unable to split argument.");
try
{
var results = new string[count];
for(int i = 0; i < count; i++)
results[i] = Marshal.PtrToStringUni(Marshal.ReadIntPtr(ret, i * IntPtr.Size));
return results;
}
finally
{
LocalFree(ret);
}
}
[DllImport("shell32.dll", SetLastError = true)]
static extern IntPtr CommandLineToArgvW([MarshalAs(UnmanagedType.LPWStr)]string cmd, out int count);
[DllImport("kernel32.dll")]
static extern IntPtr LocalFree(IntPtr mem);
}