C#Process.Start和Process.StartInfo错误

时间:2014-07-12 07:20:08

标签: c#

我试图使用以下方法点击表单来打开应用程序(.exe):

System.Diagnostics.Process.Start("C:\\Games\\GameDir\\Game.exe");

并且应用程序执行并显示错误消息“找不到background.jpg,应用程序现在将退出。”

有问题的.jpg位于.exe之外的名为“data”的文件夹中(同一目录,即C:/ Games / GameDir / data)。所以,我尝试使用:

System.Diagnostics.ProcessStartInfo pInfo = new System.Diagnostics.ProcessStartInfo();
pInfo.WorkingDirectory = "C:\\Games\\GameDir\\";

//Also tried pInfo.WorkingDirectory = "C:\\Games\\GameDir"; without ending slashes
pInfo.FileName = "Game.exe";
pInfo.UseShellExecute = false;
System.Diagnostics.Process.Start(pInfo);

并且项目无法构建,因为“系统无法找到指定的文件”(Process.Start(pInfo)上的错误)。

我必须创建一个可执行文件的快捷方式,并启动它:

System.Diagnostics.Process.Start("C:\\Games\\GameDir\\Game.exe - Shortcut");

这最终奏效了。

我的问题是 - 为什么世界上pInfo.WorkingDirectory不起作用? “p:/ Games / GameDir”的快捷方式“开始”属性与pInfo.WorkingDirectory =“C:/ Games / GameDir”有什么不同?他们不是一回事吗?

2 个答案:

答案 0 :(得分:3)

WorkingDirectory仅在UseShellExecute = true时使用。否则,将一起忽略该属性,并使用Filename完整路径。 From Microsoft's documentation

  

当UseShellExecute为false时,不是WorkingDirectory属性   用于查找可执行文件。相反,它的值适用于该过程   这是开始的,只有在新的背景下才有意义   过程

要使其正常工作,只需删除工作目录分配并使用文件名中的路径。

System.Diagnostics.ProcessStartInfo pInfo = new System.Diagnostics.ProcessStartInfo();
pInfo.FileName = "C:\\Games\\GameDir\\Game.exe";
pInfo.UseShellExecute = false;
System.Diagnostics.Process.Start(pInfo);

答案 1 :(得分:1)

许多程序遭受程序死亡的完全相同的错误。他们的代码中会有类似的声明:

  var backImage = Image.FromFile(@"data\background.jpg");

这是相对路径名。与完整路径名称相反,例如@“c:\ games \ gamedir \ data \ background.jpg。当操作系统被迫处理相对路径名时,它必须使用默认驱动器和默认目录来查找一个文件..NET程序中的Environment.CurrentDirectory。

因此,当您使用“Game.exe”时,操作系统被迫使用您的默认目录来创建完整路径名。提出类似“c:\ users \ margot \ documents \ visual studio 2013 \ projects \ gamestarter \ bin \ debug \ game.exe”的内容。 Kaboom,它不在那里。

默认工作目录的概念是非常非常邪恶,并且已经崩溃了许多程序。这是你能想象到的最糟糕的全局变量。并且存在与全局变量相关的所有问题,它可以在您不依赖它时注意到并崩溃应用程序时进行更改。只调用一段你没写过的代码就可以改变它。 .NET中最臭名昭着的例子是OpenFileDialog类。忘记将其RestoreDirectory属性设置为 true 是一个标准错误。

默认目录的概念来自20世纪70年代,当时每个人都通过在命令行界面shell程序中键入其名称来启动程序。这使得默认目录的位置非常清楚。您仍然可以在运行Cmd.exe时看到此信息,您会看到“DOS提示符”。但是在GUI操作系统中它是非常邪恶的,你再也看不到它了。

可能没有任何东西可以让游戏得到修复。您找到了正确的解决方法,设置ProcessStartInfo.WorkingDirectory是必要的,以保持它的快乐。

在您自己的代码中,请牢记黄金法则:当您在代码中引用文件时,从不使用相对路径。在你的程序中,这应该是一个配置设置,因为你不能假设游戏将永远安装到c:\ games \ gamedir。迟早,有人会认识到它属于c:\ program files:)