我试图使用以下命令在窗体上单击按钮以打开应用程序(.exe):
System.Diagnostics.Process.Start("C:\\Games\\GameDir\\Game.exe");
并且应用程序执行并显示错误消息“找不到background.jpg,应用程序将立即退出。”
所涉及的.jpg位于.exe外部的名为“数据”的文件夹中(相同目录,即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无法正常工作?快捷方式的“ C:/ Games / GameDir”的“开始于”属性与pInfo.WorkingDirectory =“ C:/ Games / GameDir”有何不同?他们不是同一回事吗?
许多程序都遭受与您的程序相同的错误。他们的代码中将有一条与此语句类似的语句:
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是一个标准错误。
默认目录的概念来自1970年代,那时候每个人都通过在命令行界面外壳程序中键入其名称来启动程序。这很清楚地显示了默认目录的位置。您在运行Cmd.exe时仍然可以看到此消息,您会看到“ DOS提示符”。但是在GUI操作系统中这是非常邪恶的,您再也看不到它了。
要修复该游戏,可能您无能为力。您找到了正确的解决方法,需要设置ProcessStartInfo.WorkingDirectory才能保持满意。
在您自己的代码中,请牢记黄金法则:在代码中引用文件时,切勿使用相对路径。在您的程序中,这应该是一个配置设置,因为您不能假定游戏将始终安装到c:\ games \ gamedir。迟早会有人认识到它属于c:\ program文件:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句