为何我的C#程序无法找到指定的*.exe文件?
为啥会报错?
兄弟,你踩了个典型的坑:嵌入到项目资源里的exe不是磁盘上的独立文件,Process.Start()要的是真实存在的磁盘文件路径,但你直接写"olderApp.exe"(系统会在当前程序目录找,可这文件根本不在那),或者写错语法的@"Properties.Resources.olderApp.exe"(这玩意儿根本不是路径,Properties.Resources.olderApp其实是个字节数组),系统当然找不到文件啦!
正确的操作方式
要运行这个嵌入的旧exe,得先把它从资源里“抠”出来存到磁盘上,再启动这个临时文件,给你写好代码了:
private void button1_Click(object sender, EventArgs e) { // 第一步:找个临时位置存exe,比如系统临时文件夹 string tempExePath = Path.Combine(Path.GetTempPath(), "olderApp.exe"); // 第二步:把资源里的二进制数据写入临时文件 File.WriteAllBytes(tempExePath, Properties.Resources.olderApp); // 第三步:启动这个临时文件 ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = tempExePath; try { var process = Process.Start(startInfo); // 可选:等旧程序退出后自动删除临时文件 process.Exited += (s, args) => { if (File.Exists(tempExePath)) { try { File.Delete(tempExePath); } catch { } } }; process.EnableRaisingEvents = true; } catch (Exception ex) { MessageBox.Show($"启动失败:{ex.Message}"); // 启动失败时清理临时文件 if (File.Exists(tempExePath)) { File.Delete(tempExePath); } } }
几个要注意的小细节
- 确认资源名称:你在项目资源里加的exe,对应的资源名是
olderApp(不带.exe后缀),所以代码里用Properties.Resources.olderApp才对,别瞎加后缀。 - 权限问题:如果临时文件夹写不进去,换个路径试试,比如应用自己的Data目录:
Path.Combine(Application.LocalUserAppDataPath, "olderApp.exe")。 - 临时文件清理:上面代码里加了退出后删除的逻辑,要是怕删不掉(比如旧程序卡死),也可以不管,系统临时文件夹会自动清理,但还是尽量清理更优雅。
内容的提问来源于stack exchange,提问作者ASiDesigner
相关产品推荐
相关产品推荐

