Вкратце, я пишу интерфейс для эмулятора MAME в качестве исследования в WPF и C #.

Графический интерфейс настроен, он правильно читает 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");

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

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

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

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

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

Обновление:
Я хотел добавить, что программа (для тех, кто не знакомы) полагается на имя файла 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
Aloehart 5 Фев 2015 в 18:29

1 ответ

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

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

ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo
{
    FileName = appFilename,
    Arguments = "-File " + viewFilename, // space char after -File
};
Process.Start(startInfo);
1
Matt 13 Июл 2017 в 16:01