2015-02-05 4 views
1

Короче говоря, я пишу интерфейс для эмулятора MAME как исследование в WPF и C#.Process.Start и Process.StartInfo не правильно передают аргументы

Графический интерфейс настроен, он правильно считывает cfg, все в порядке, за исключением фактически запуска MAME.

Из командной строки (Windows 7) я могу ввести следующее и правильно запустить запуск эмулятора.

c:\MAME\Emulator\mame.exe mslug.zip 

Это запускает эмулятор без проблем точно так же, как и предусмотрено. Однако я пробовал все следующее.

Process Mame = new Process(emulatorPath); 
Mame.StartInfo.Arguments = romSelected; 
Mame.Start(); 

Я попытался выше как с переменной и положить Mame.StartInfo.Arguments = «mslug.zip»

ProcessStartInfo Mame = new ProcessStartInfo(emulatorPath); 
Mame.Arguments = romSelected; 
Process.Start(Mame); 

Я попытался это также и с переменной и ввода «mslug.zip» в его месте.

Наконец я попробовал следующее.

Process.Start(@"c:\Mame\emulator\mame.exe", "mslug.zip"); 

И действует так же, как и предыдущие попытки.

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

Из того, что я прочитал о Process.Start и т. П., То, что я набрал выше, должно совпадать с открытием командной строки и ввода команды, с которой я начал этот пост. Но если это так, то это должно было работать без проблем. Я не уверен, что я делаю что-то неправильно или если есть лучший способ сделать это.

Примечание. Я также просмотрел графический интерфейс Windows и создал ярлык для mame.exe и отредактировал его свойства, чтобы передать mslug.zip в качестве аргумента, и он также работал, поэтому он не требует, чтобы это выполнялось через насколько я могу судить по командной строке.

Как утверждают, у меня есть отлаженные текстовые поля в gui приложения, которые обновляются переменными, используемыми в моем коде, чтобы проверить правильность переменных.

Обновление:
Я хотел добавить, что программа (для тех, кто не знаком) полагается на имя файла rom, который вы пытаетесь запустить. Значение передачи аргумента mslug.zip заставляет программу перейти в собственный каталог rom (в настоящее время C: \ mame \ emulator \ roms) и искать mslug.zip. Я могу запустить эту команду из любого каталога в моей системе и получить тот же результат. Я также могу пройти путь к рому, как

c:\mame\emulator\mame.exe c:\mame\emulator\roms\mslug.zip 

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

string romSelected = @"c:\mame\emulator\roms\mslug.zip"; 

Оба терпят неудачу в той же манере.

+2

насчет ** рабочего каталога **? Из командной строки вы находитесь в каталоге, где 'mslug.zip', из вашего приложения вы находитесь в его рабочем каталоге (например, каталог bin/debug). –

+0

Вы пробовали поиск в Google, есть много примеров того, как это сделать правильно, а также 'SO' http://stackoverflow.com/questions/15061854/how-to-pass-multiples-arguments-in- processstartinfo Мне интересно, если вы прошли через код и оценили все параметры и переменные и т. д. – MethodMan

+0

@MethodMan: Вопрос, на который вы указываете, - это несколько параметров. Здесь есть только один. Код из OP в порядке. –

ответ

2

Код, который вы используете, отлично работает. Это делает отправьте правильный аргумент программе. Без сомнений.

Некоторые вещи, которые могли бы пойти не так:

  • Файл не существует;
  • Файл не существует в текущем рабочем каталоге, а также место, где его ищет mame (вы можете попробовать использовать несуществующее имя файла в командной строке в качестве теста. , то, вероятно, файл не найден. Попробуйте использовать полный путь к файлу );
  • Некоторые проблемы с разрешением, ошибка скрыта программой.

Как предлагалось Sinatr, вы можете установить текущий рабочий каталог, используя Directory.SetCurrentDirectory. Имейте в виду, что на текущий рабочий каталог этой программы также влияет, поэтому вы можете подумать над тем, что вы делаете.

Лучше установить рабочий каталог процесса, который вы запускаете, используя Process.WorkingDirectory.

+0

Вот что я думал, но эмулятор фактически не требует пути. Он предназначен для получения имени файла и проверки его папки roms. Я могу запустить команду из любого каталога и получить тот же результат из строки comand. – Aloehart

+2

А как насчет собственно рабочего эмулятора? Возможно, он не может найти 'rom', потому что он начинает поиск из неправильного базового каталога из-за того, как вы его запускаете. Попробуйте [установить его] (https://msdn.microsoft.com/en-us/library/system.io.directory.setcurrentdirectory (v = vs.110) .aspx). – Sinatr

+0

@Sinatr Если вы это сделаете, добавьте это в свой первоначальный ответ, поскольку это устранит проблему. Кажется странным, что у него будет такая проблема, но я рад узнать что-то новое.Большое спасибо за помощь :) – Aloehart

1

Только присваивание StartInfo.Arguments с именем файла не работает. Вы должны добавить действие как -File. Это создаст 2 аргумента для принимающего приложения (args [0] = "- Файл", args [1] = имя файла).

Вот что работает для меня:

ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo 
{ 
    FileName = appFilename, 
    Arguments = "-File " + viewFilename, // space char after -File 
}; 
Process.Start(startInfo); 
Смежные вопросы