Process.Start 问题启动我的游戏

Posted

技术标签:

【中文标题】Process.Start 问题启动我的游戏【英文标题】:Process.Start issue Launching my game 【发布时间】:2013-04-16 19:15:39 【问题描述】:

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

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

我得到一个未处理的异常或找不到错误。

但如果我这样做:

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

它有效。问题出在哪里?

【问题讨论】:

发布您的确切例外(不是释义) 顺便说一句,相对路径是一个更好的解决方案。如果你正确设置了工作目录。 Game.bat 是否在您的 \bin 文件夹中? 第一个示例的路径不正确,第二个示例的 bin/Debug 文件夹中的 game.bat 文件是什么 【参考方案1】:

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

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 我的世界 = 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); 

【讨论】:

OK 这是我的代码:namespace GameLauncher public partial class Form2 : Form public Form2() InitializeComponent(); private void Form2_Load(object sender, EventArgs e) string executableDir = Path.GetDirectoryName(Application.ExecutablePath); Process.Start(Path.Combine(executableDir,@"F:\Freak Mind Games\Projects 2013\JustShoot\game.bat")); 这是我遇到的两个错误:dl.dropboxusercontent.com/u/42689244/error1.JPGdl.dropboxusercontent.com/u/42689244/error2.JPG 变量executableDir 已经包含目录。因此删除路径的目录部分! Path.Combine(executableDir, "game.bat")。可能executableDir 包含:"F:\Freak Mind Games\Projects 2013\JustShoot" 对不起。我不明白。我必须将路径 F:\Freak Mind Games\Projects 2013\JustShoot\ 放在哪里? 无处可去! Path.GetDirectoryName(Application.ExecutablePath) 为您提供justshoot.exe 的目录。 但我不想将它放在文件夹中:P 现在,当我将它放在 Just Shoot 的文件夹中时,它会运行,但我不想这样做:P

以上是关于Process.Start 问题启动我的游戏的主要内容,如果未能解决你的问题,请参考以下文章

C# Process.Start 路径

安装程序在使用 Process.Start() 启动时失败,但在双击时工作

System.Diagnostics.Process.Start() 从 Windows 服务调用时无法启动进程

Process.Start() 未启动 .exe 文件(手动运行时有效)

01进程

将由 ShellExec/Process.Start 启动的浏览器置于最前面