Как я могу очистить CommandLineArgs приложения из кода? - PullRequest
2 голосов
/ 14 октября 2011

У нас есть стороннее диалоговое окно входа в систему, которое пропускает приглашение входа в систему, если данные входа передаются через аргументы командной строки. Используется, когда приложение запускается из основного стороннего программного обеспечения.

Пользовательское приложение, которое я пишу, должно предоставлять пользователям кнопку для изменения их регистрационной информации, однако, поскольку приложение запускается с регистрационной информацией, указанной в аргументах командной строки, диалоговое окно входа в систему никогда не появляется при нажатии кнопки.

Можно ли очистить или сбросить Environment.GetCommandLineArgs() из кода?

Редактировать

В итоге я просто перезапустил приложение перед запуском, если в командной строке существовала информация для входа. Это заставляет сторонний диалог входа в систему фактически отображаться вместо того, чтобы автоматически использовать информацию для входа в систему, указанную в аргументах командной строки.

Я принимаю ответ Джима , потому что я считаю, что это наиболее полный ответ на мой вопрос, хотя Ответ Одеда также является жизнеспособной альтернативой.

Ответы [ 3 ]

3 голосов
/ 14 октября 2011

То, что вы спрашиваете, не может быть выполнено в .NET, потому что класс Environment кэширует командную строку и отсутствует средство доступа к свойству для его установки.(Точнее, код запуска кэширует командную строку и Environment.CommandLine вызывает среду выполнения для получения этого кэшированного значения.)

В собственном приложении Windows функция API GetCommandLine() возвращает указатель на командустрока, которую операционная система представила в программу.Программа может вызвать CommandLineToArgvW для разбора командной строки на стандартные параметры argv и argc, знакомые программистам на C и C ++.

Класс Environment использует нечто подобное.Когда вы вызываете Environment.GetCommandLineArgs, он обращается к свойству Environment.CommandLine, а затем вызывает функцию windows CommandLineToArgvW для анализа командной строки.Но Environment.CommandLine не получает значение от GetCommandLine().Вместо этого программа получает командную строку Windows при запуске (вызывая GetCommandLine()), а затем сохраняет ее.

Это прискорбно, поскольку вы можете изменить значение, которое GetCommandLineвозвращает, как показано в этом небольшом фрагменте:

[DllImport("kernel32")]
static extern IntPtr GetCommandLine();

static void DoIt()
{
    IntPtr pcmdline = GetCommandLine();
    Console.WriteLine("Environment.CommandLine = {0}", Environment.CommandLine);
    string realCmdLine = Marshal.PtrToStringAnsi(pcmdline);
    Console.WriteLine("realCmdLine = {0}", realCmdLine);

    Console.WriteLine("** Modify command line");
    // Modify the command line
    byte[] bytes = Encoding.ASCII.GetBytes("ham and swiss on rye\0");
    Marshal.Copy(bytes, 0, pcmdline, bytes.Length);

    Console.WriteLine("Environment.CommandLine = {0}", Environment.CommandLine);
    pcmdline = GetCommandLine();
    realCmdLine = Marshal.PtrToStringAnsi(pcmdline);
    Console.WriteLine("realCmdLine = {0}", realCmdLine);
}

Если вы запустите это, вы обнаружите, что Environment.CommandLine возвращает одну и ту же строку оба раза, тогда как при втором вызове GetCommandLine вы 'вернем строку ham and swiss on rye.

Даже если вышеуказанное сработало , нет гарантии, что оно решит вашу проблему.Сторонний элемент управления может анализировать командную строку, кэшировать информацию для входа и никогда больше не анализировать командную строку.

1 голос
/ 14 октября 2011

Вы можете использовать Process.Start для запуска нового экземпляра приложения, предоставления новых учетных данных в качестве аргументов и выхода из текущего экземпляра.

0 голосов
/ 14 октября 2011

Добавьте дополнительные аргументы командной строки, чтобы указать это вторичное условие.Например, аргумент может быть ShowLogin.Если true, то аргументы командной строки предварительно заполняют диалог входа в систему, и пользователи могут обновлять там информацию по мере необходимости.Если false, то аргументы используются для автоматического входа без отображения диалога.

...