Process.Start问题启动我的游戏

时间:2013-04-16 19:15:40

标签: c# .net process.start

目前我正在尝试为我的游戏编写一个启动器。我的问题是,如果你以这种方式推出我的游戏:

System.Diagnostics.Process.Start(@"F:\Freak Mind Games\Projects 2013\JustShoot\game.bat");

我收到未处理的异常或找不到错误。

但如果我这样做:

System.Diagnostics.Process.Start(@"game.bat");

有效。这个问题在哪里?

1 个答案:

答案 0 :(得分:3)

我假设批处理文件与程序启动器位于同一目录中。自动确定其位置:

string executableDir = Path.GetDirectoryName(Application.ExecutablePath);
Process.Start(Path.Combine(executableDir, "game.bat"));

哪里

  • Application.ExecutablePath是您的可执行文件的路径,即 F:\Freak Mind Games\Projects 2013\JustShoot\justshoot.exe

  • Path.GetDirectoryName(...)获取目录的一部分,即 F:\Freak Mind Games\Projects 2013\JustShoot

  • Path.Combine(executableDir, "game.bat")将目录与game.bat合并,即F:\Freak Mind Games\Projects 2013\JustShoot\game.bat


请记住,从Visual Studio启动时,可执行路径为"...\bin\Debug""...\bin\Release"。因此,如果批处理文件位于项目目录中,则可能需要从路径中删除这些部分。

const string DebugDir = @"\bin\Debug";
const string ReleaseDir = @"\bin\Release";

string executableDir = Path.GetDirectoryName(Application.ExecutablePath);
if (executableDir.EndsWith(DebugDir)) {
    executableDir =
        executableDir.Substring(0, executableDir.Length - DebugDir.Length);
} else if (executableDir.EndsWith(ReleaseDir)) {
    executableDir =
        executableDir.Substring(0, executableDir.Length - ReleaseDir.Length);
}
Process.Start(Path.Combine(executableDir, "game.bat"));

<强>更新

目录的硬编码不是一个好主意。将要启动的游戏路径放在与游戏启动器相同的目录中的文本文件中(例如“launch.txt”)。每一行都包含一个可以使用游戏名称及其路径启动的游戏。像这样:

Freak Mind Games = F:\Freak Mind Games\Projects 2013\JustShoot\game.bat
Minecraft = C:\Programs\Minecraft\minecraft.exe

在表单中将目录定义为变量:

private Dictionary<string,string> _games;

现在获取这样的游戏列表:

string executableDir = Path.GetDirectoryName(Application.ExecutablePath);
string launchFile = Path.Combine(executableDir, "launch.txt"));

string[] lines = File.ReadAllLines(launchFile);

// Fill the dictionary with the game name as key and the path as value.
_games = lines
    .Where(l => l.Contains("="))
    .Select(l => l.Split('='))
    .ToDictionary(s => s[0].Trim(), s => s[1].Trim());

然后在ListBox

中显示游戏名称
listBox1.AddRange(
     _games.Keys
        .OrderBy(k => k)
        .ToArray()
);

最后用

启动所选游戏
string gamePath = _games[listBox1.SelectedItem];
var processStartInfo = new ProcessStartInfo(gamePath);
processStartInfo.WorkingDirectory = Path.GetDirectoryName(gamePath);
Process.Start(processStartInfo);