Вкратце, я пишу интерфейс для эмулятора 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";
Оба терпят неудачу одинаково.
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);
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.