Замена аргументов процесса для приложения C # - PullRequest
1 голос
/ 12 июля 2011

Есть ли способ заменить значения аргументов управляемого процесса, как это можно сделать для собственной программы, как описано здесь ?

Вот программа, которую я написал, пытаясьсделать то же самое, но это не сработало, как в другом случае:

        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 Ответ

2 голосов
/ 12 июля 2011

Environment.GetCommandLineArgs() скорее всего использует родной GetCommandLine() в Windows.Однако возвращаемое значение будет маршалировано в строки .Net и не будет влиять на собственный указатель, фактически возвращаемый GetCommandLine().

. Вы должны принять, что это только для чтения у вас нет никаких гарантий, что запись в указатель не приведет к ошибке.Я уверен, что вы могли бы использовать определение P / Invoke GetCommandLine() и IntPtr, чтобы перезаписать командную строку, но это неопределенное поведение и не гарантированно будет работать в будущем (такого рода предположения - то, что Раймондчасто указывает в своих статьях).

...