替换C#应用程序的进程参数

时间:2011-07-12 19:00:30

标签: c# .net arguments

有没有办法替换托管流程参数的值,就像可以为本地程序完成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

提前谢谢。

1 个答案:

答案 0 :(得分:2)

Environment.GetCommandLineArgs()可能会在Windows上使用本机GetCommandLine()。但是,返回值将被封送到.Net字符串中,并且不会对GetCommandLine()实际返回的本机指针产生任何影响。

您应该假设这是只读并且您无法保证写入指针不会导致错误。我确定你可以使用GetCommandLine()IntPtr的P / Invoke定义来覆盖命令行,但这是未定义的行为,并且不保证将来可以使用(这些类型的假设是雷蒙德经常在他的文章中指出的。