繁体   English   中英

C#Process.Start和Process.StartInfo错误

[英]C# Process.Start and Process.StartInfo errors

我试图使用以下命令在窗体上单击按钮以打开应用程序(.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”有何不同? 他们不是同一回事吗?

仅当UseShellExecute = true时才使用WorkingDirectory。 否则,将一起忽略该属性,并使用“文件名”完整路径。 从Microsoft的文档中

如果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);

许多程序都遭受与您的程序相同的错误。 他们的代码中将有一条与此语句类似的语句:

  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文件:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM