Проблема с аргументами командной строки в C # - PullRequest
0 голосов
/ 08 апреля 2009

У меня есть простая проблема, которую я не могу решить самостоятельно. У меня есть приложение WinForm, модифицированный метод main для приема аргументов командной строки, например:

    [STAThread]
    static void Main(String[] args)
    {
        int argCount = args.Length;
    }

Этот код работает нормально, и argCount равен 2 при компиляции в режиме отладки со следующей строкой выполнения: program.exe -file test.txt. Однако, как только я скомпилирую программу в режиме выпуска, argCount теперь равен 1 с теми же аргументами командной строки. Единственный аргумент содержит «-file test.txt». Более того, это происходит только в том случае, если я запускаю скомпилированный исполняемый файл из папки obj / Release, но не из bin / Release. К сожалению, установочный проект берет исполняемые файлы из obj / Release, поэтому я не могу это изменить. Это известная проблема, и есть ли способ обойти эту проблему?

Ответы [ 4 ]

1 голос
/ 08 апреля 2009

Обработка командной строки должна быть такой же, поэтому происходит что-то еще. Когда я пытаюсь это:

class Program {
    [STAThread]
    static void Main(String[] args) {
        Console.WriteLine("Have {0} arguments", args.Length);
        for (int i = 0; i < args.Length; ++i) {
            Console.WriteLine("{0}: {1}", i, args[i]);
        }
    }
}

и затем из разных мест я получаю 100% непротиворечивые результаты, единственный способ "объединить" аргументы - заключить их в кавычки в командной строке (которая специально предназначена для того, чтобы у вас были аргументы, содержащие пробел см. последний пример ниже):

PS C:\...\bin\Debug> .\ConsoleApplication1.exe one two three
Have 3 arguments
0: one
1: two
2: three
PS C:\...\bin\Debug> pushd ..\release
PS C:\...\bin\Release> .\ConsoleApplication1.exe one two three
Have 3 arguments
0: one
1: two
2: three
PS C:\...\bin\Release> pushd ..\..\obj\debug
PS C:\...\obj\Debug> .\ConsoleApplication1.exe one two three
Have 3 arguments
0: one
1: two
2: three
PS C:\...\obj\Debug> pushd ..\release
PS C:\...\obj\Release> .\ConsoleApplication1.exe one two three
Have 3 arguments
0: one
1: two
2: three
PS C:\...\obj\Release> .\ConsoleApplication1.exe -file test.txt
Have 2 arguments
0: -file
1: test.txt
PS C:\...\obj\Release> .\ConsoleApplication1.exe "-file test.txt"
Have 1 arguments
0: -file test.txt

Дополнительно Хотя запуск из командной строки позволяет легко увидеть, что передается, может быть трудно проверить, когда другое приложение запускает ваше. Однако такие инструменты, как Process Explorer , покажут командную строку, используемую для запуска программы (дважды щелкните процесс и посмотрите на вкладку изображения).

1 голос
/ 08 апреля 2009

Это работает для меня из bin / Debug, bin / Release, obj / Debug и obj / Release:

static class Program {
  /// <summary>
  /// The main entry point for the application.
  /// </summary>
  [STAThread]
  static void Main(string[] args) {
    FormMain.Args = args;

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormMain());
  }
}

  public partial class FormMain: Form {
    public static string[] Args;

    public FormMain() {
      InitializeComponent();
    }

    private void FormMain_Shown(object sender, EventArgs e) {
      foreach (string s in Args) {
        MessageBox.Show(s);
      }
    }
  }
0 голосов
/ 08 апреля 2009

Ваша проблема (как указывает Ричард в своем коде) состоит в том, что все ваши аргументы при запуске версии выпуска заключены в один набор кавычек. Удалите цитаты, и это будет работать.

0 голосов
/ 08 апреля 2009

Вы пробовали Environment.GetCommandLineArgs () ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...