C# UDP接收回调中调用Process启动Subnautica时报进程启动错误
问题原因与解决方案
常见报错原因
- 路径配置或权限问题:要么目标exe路径拼写错误、包含未转义的特殊字符,要么当前C#程序的运行账户没有该路径的读取执行权限,部分游戏也需要管理员权限才能正常启动
- 工作目录缺失:Subnautica启动时依赖同目录下的资源、动态链接库等文件,你没有配置
WorkingDirectory属性,进程默认会以你的C#程序运行目录作为工作目录,找不到依赖就会启动失败 - 异步回调线程限制:
DataReceived是UDP接收的异步后台线程,部分系统环境下后台线程直接启动进程会有权限上下文限制 - 重复启动冲突:每次收到UDP数据都会触发启动逻辑,游戏已运行的情况下重复调用
Start()也会抛出对应错误
修复方案
按下方代码修改即可,补充了工作目录配置、运行状态校验、异常捕获逻辑:
// 全局变量标记游戏是否已启动,避免重复启动 private static bool _gameStarted = false; private static void DataReceived(IAsyncResult ar) { UdpClient c = (UdpClient)ar.AsyncState; IPEndPoint receivedIpEndPoint = new IPEndPoint(IPAddress.Any, 0); Byte[] receivedBytes = c.EndReceive(ar, ref receivedIpEndPoint); string receivedText = ASCIIEncoding.ASCII.GetString(receivedBytes); Console.Write(receivedIpEndPoint + ": " + receivedText + Environment.NewLine); c.BeginReceive(DataReceived, ar.AsyncState); // 游戏已启动就跳过执行 if(_gameStarted) return; var p = new Process { StartInfo = { FileName = @"C:\Users\Andrei\Desktop\Subnautica.v63668\Subnautica.exe", Arguments = "127.0.0.1 20000", UseShellExecute = true, // 补充游戏所在目录作为工作目录 WorkingDirectory = @"C:\Users\Andrei\Desktop\Subnautica.v63668\", // 如果需要管理员权限启动,打开下面一行注释 // Verb = "runas" } }; try { p.Start(); _gameStarted = true; // 可选:监听游戏退出事件,重置启动标记 p.EnableRaisingEvents = true; p.Exited += (s, e) => { _gameStarted = false; p.Dispose(); }; } catch(Exception ex) { // 打印具体错误信息,方便定位剩余问题 Console.WriteLine($"进程启动失败:{ex.Message},堆栈:{ex.StackTrace}"); } }
如果修改后还是报错,可以先手动双击对应路径下的Subnautica.exe确认游戏本身可以正常启动,排除游戏文件损坏的问题。
内容的提问来源于stack exchange,提问作者Andrei_
相关产品推荐
相关产品推荐

