2009-04-12 1 views
21

Я пишу класс .NET, который должен анализировать командную строку процесса. Я не хочу иметь зависимость между методом Main() и этим классом. Как класс может получить доступ к командной строке?Как получить доступ к параметрам командной строки за пределами Main в C#

ответ

37

Звоните Environment.GetCommandLineArgs().

+2

GetCommandLineArgs является [серьезно испорчено] (http://stackoverflow.com/questions/9287812/backslash-and-quote-in-command-line-arguments). Избегайте. Распространить слово. – Neolisk

1
System.Diagnostics.Process.GetCurrentProcess().StartInfo.Arguments 
+0

На самом деле это не работает. Кажется, всегда пусто. См. Http://stackoverflow.com/questions/344056/why-is-startinfo-processstartinfo-always-empty – Carsten

1

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

В качестве альтернативы, вы могли бы инициализировать класс в любое время после его создания с помощью метода CustomConfigClass.Create(), который использует Environment.GetCommandLineArgs().

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

+0

Первый вариант по-прежнему требует, чтобы основной метод знал о другом классе, поэтому он не решает мою проблему. Я использую контейнер IOC, поэтому я создам службу, которая предоставляет функциональность GetCommandLineArgs, и от этого зависит моя другая служба. Благодарю. –

+1

Тем не менее, я пропустил свою точку зрения. Если вы используете IoC, тогда у вас нет службы для возврата аргументов командной строки, есть интерфейс службы, который возвращает конфигурацию, и реализует это с классом, который получает его из командной строки. Таким образом, вы можете заменить другим классом для модульного тестирования. –

-2

String [] myStr = Environment.GetCommandLineArgs();

его всегда хорошо, чтобы завершить пример.

4

При использовании .NET Framework Compact, Environment.GetCommandLineArgs() метод не реализован и System.Diagnostics.Process.GetCurrentProcess(). StartInfo.Arguments всегда возвращает пустую строку, так вы должны использовать основную функцию и передать аргументы другим классам.

Пример:

[MTAThread] 
static void Main(String[] commandLineArguments) 
{ 
    CommandLineHelper.parse(commandLineArguments); 
} 

public static class CommandLineHelper 
{ 
    public static void parse(String[] commandLineArguments) { 
    // add your code here 
    } 
} 
+0

Спасибо за Compact Framework. В моем случае я не хотел показывать основную форму, когда были указаны аргументы args, так что exe запускался в бесшумном режиме, но, как вы предположили, вы можете хранить эти аргументы в статическом классе, который будет доступен для всех форм заявление. Это должно работать в любых рамках. Для заинтересованных здесь был мой код. [MTAThread] static void Main (String [] cmd) { if (cmd.Length == 0) Application.Run (new frmMain()); else MessageBox.Show (cmd [0]); } – kuklei

Смежные вопросы