使用Process.Start启动两个相同应用时第二个闪退如何解决
问题根因
你遇到的问题90%以上是工作目录(WorkingDirectory)配置错误导致的:
- 手动双击exe启动时,系统会自动将进程的工作目录设置为exe文件所在的文件夹,程序可以正常读取同目录下的配置、依赖资源
- 直接调用
Process.Start(文件路径)时,新进程的工作目录默认继承自你的调用程序的工作目录,不是exe自身所在的目录。两个同款程序如果都读取工作目录下的同名配置文件,要么出现资源冲突,要么第二个程序找不到自己目录下的专属配置,启动后直接崩溃退出。
正确实现方式
不要直接传路径给Process.Start,而是显式构造ProcessStartInfo对象,为每个进程单独指定工作目录:
// 启动第一个程序 var startInfo1 = new ProcessStartInfo { FileName = @"D:\Clients\Client1\program.exe", WorkingDirectory = @"D:\Clients\Client1\", // 必须和exe所在目录保持一致 UseShellExecute = true // 适配不同.NET版本的行为,和手动启动效果完全一致 }; Process.Start(startInfo1); // 启动第二个程序 var startInfo2 = new ProcessStartInfo { FileName = @"D:\Clients\Client2\program.exe", WorkingDirectory = @"D:\Clients\Client2\", // 单独指定第二个程序的工作目录 UseShellExecute = true }; Process.Start(startInfo2);
其他排查点
如果上面的方案未解决问题,可以按以下方向进一步定位:
- 捕获进程退出代码:启动进程后保留
Process实例,等待进程退出后查看ExitCode值,对照程序的错误码规则定位原因 - 捕获进程输出:如果目标程序会输出标准错误/标准日志,可以在
ProcessStartInfo中开启RedirectStandardError = true、RedirectStandardOutput = true,读取输出内容获取具体报错信息 - 如果你手动可以正常启动两个实例,可直接排除程序单实例限制的问题
内容的提问来源于stack exchange,提问作者PetruTofan
相关产品推荐
相关产品推荐

