То, что вы спрашиваете, не может быть выполнено в .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
.
Даже если вышеуказанное сработало , нет гарантии, что оно решит вашу проблему.Сторонний элемент управления может анализировать командную строку, кэшировать информацию для входа и никогда больше не анализировать командную строку.