Process.Start和Process.StartInfo没有正确传递参数

时间:2015-02-05 15:29:13

标签: c# .net process.start

简短的故事是我正在为模拟器MAME编写前端作为WPF和C#的研究。

设置了GUI,它正确地阅读了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);

我也尝试了变量和put" mslug.zip"在它的位置。

最后我尝试了以下内容。

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

它的行为与之前的尝试相同。

如果我不尝试将参数传递给它,那么程序就会正常运行,只是告诉我没有rom。传递参数的任何上述方法都会导致快速命令提示blip,如果rom的zip文件为空,则显示相同的信息。

从我读过的有关Process.Start等的内容来看,我上面输入的内容应该等同于打开命令行并输入我开始发布此帖子的命令。但如果是这样,那么这应该没有问题。我不确定我是做错了什么,或者是否有更好的方法来解决这个问题。

注意:我还浏览了Windows GUI并创建了mame.exe的快捷方式,并编辑了它的属性以将mslug.zip作为参数传递,并且它也有效,所以它不需要据我所知,它是通过命令行完成的。

作为助手,我在应用程序的gui中调试了文本框,这些文本框使用我的代码中使用的变量进行更新,以验证变量是否正确。

更新:
我想补充一点,该程序(对于那些不熟悉的程序)依赖于您尝试启动的rom的文件名。传递参数mslug.zip的含义导致程序转到它自己的rom目录(当前为C:\ mame \ emulator \ roms)并搜索mslug.zip。我可以从我系统中的任何目录运行该命令,并获得相同的结果。我也可以将路径传递给rom,如

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

无论我在哪里运行它都会有效。我已经在我的代码中尝试了这一点,通过将路径作为变量传递并将它们传递给

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

两者都以同样的方式失败。

2 个答案:

答案 0 :(得分:2)

您使用的代码工作正常。它 向程序发送正确的参数。毫无疑问。

可能出错的一些事情:

  • 文件不存在;
  • 文件在当前工作目录中不存在,也就是mame正在查找的位置(您可以尝试在命令行中使用不存在的文件名)作为测试。错误是否相同,那么可能找不到文件。尝试使用文件的完整路径);
  • 某些权限问题,程序会掩盖错误。

建议Sinatr,您可以使用Directory.SetCurrentDirectory设置当前工作目录。请注意,此程序的当前工作目录也会受到影响,因此您可能需要考虑自己在做什么。

您最好使用Process.WorkingDirectory设置您开始的流程的工作目录。

答案 1 :(得分: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);