有没有办法替换托管流程参数的值,就像可以为本地程序完成here所描述的那样?
这是我写的一个程序试图做同样的事情,但它没有像其他情况那样工作:
static void Main(string[] args)
{
if (args == null)
{
return;
}
foreach (String arg in args)
{
Console.WriteLine("Before: " + arg);
unsafe
{
fixed (char* ptr = arg)
{
for (int i = 0; i < arg.Length; i++)
{
*(ptr + i) = 'x';
}
}
}
Console.WriteLine("After: " + arg);
}
Console.WriteLine("Environment.GetCommandLineArgs(): ");
foreach (String arg in Environment.GetCommandLineArgs())
{
Console.WriteLine(arg);
}
}
结果是:
Before: asdf
After: xxxx
Before: lkjasdf
After: xxxxxxx
Before: ;lkajsdf
After: xxxxxxxx
Environment.GetCommandLineArgs():
ConsoleApplication2.exe
asdf
lkjasdf
;lkajsdf
提前谢谢。
答案 0 :(得分:2)
Environment.GetCommandLineArgs()
可能会在Windows上使用本机GetCommandLine()
。但是,返回值将被封送到.Net字符串中,并且不会对GetCommandLine()
实际返回的本机指针产生任何影响。
您应该假设这是只读并且您无法保证写入指针不会导致错误。我确定你可以使用GetCommandLine()
和IntPtr
的P / Invoke定义来覆盖命令行,但这是未定义的行为,并且不保证将来可以使用(这些类型的假设是雷蒙德经常在他的文章中指出的。