为何.NET 5.0调用Process.Start打开被占用文件报错但.NET Framework 4.7.1正常
问题根因
这是.NET 5+ 针对Process.Start的官方破坏性变更导致的行为差异:
- .NET Framework环境下,
ProcessStartInfo.UseShellExecute属性的默认值为true,调用Process.Start(文件路径)时底层走系统ShellExecute逻辑,仅将文件路径交给系统匹配关联程序启动,不会主动占用/锁定目标文件,所以哪怕文件被其他进程占用也能正常触发关联程序启动。 - .NET 5+环境下,
ProcessStartInfo.UseShellExecute属性的默认值改为false,默认优先走CreateProcess逻辑,该逻辑会先尝试以独占模式打开目标文件校验是否为可执行程序,这一步就会触发文件占用报错。
解决方案
最通用的方案是显式指定UseShellExecute = true,即可完全还原.NET Framework下的原有行为,且支持跨平台运行,修改后的代码如下:
Process.Start(new ProcessStartInfo(sourceFile) { UseShellExecute = true });
如果你的程序仅面向Windows环境,且需要固定启动程序,也可以手动指定关联程序路径作为启动入口,将目标文件作为参数传入,避免框架层直接操作目标文件:
// 示例为AutoCAD场景,其他关联程序替换对应安装路径即可 Process.Start(new ProcessStartInfo { FileName = @"C:\Program Files\Autodesk\AutoCAD 202X\acad.exe", Arguments = $"\"{sourceFile}\"" });
内容的提问来源于stack exchange,提问作者jeleleven
相关产品推荐
相关产品推荐

