WPF中Process.Start启动部分System32程序提示路径不存在异常
根本原因
这是64位Windows系统的文件系统重定向机制导致的,你的WPF应用当前是以32位(x86)模式运行的。
64位Windows对系统文件做了分层存储:
- 原生64位系统文件存放于真实的
C:\Windows\System32目录 - 32位兼容版本的系统文件存放于
C:\Windows\SysWOW64目录
为了兼容旧版32位程序,系统默认会对所有32位进程开启路径重定向:当32位进程尝试访问C:\Windows\System32路径时,系统会在底层自动把路径替换为C:\Windows\SysWOW64,这个过程对应用是无感知的。
你观察到的现象完全匹配这个机制逻辑: - 能正常启动的
appwiz.cpl、desk.cpl、mmsys.cpl等文件,在SysWOW64目录下存在对应的32位版本,重定向后可以找到文件,因此启动正常 - 启动失败的
firewall.cpl、igfxCPL.cpl、compmgmtlauncher.exe仅提供64位版本,只存在于真实的System32目录下,SysWOW64中无对应文件,重定向后找不到目标就会抛出文件不存在的Win32异常
手动在资源管理器输入路径能正常打开,是因为资源管理器本身是64位进程,不会触发这个重定向逻辑,直接访问了真实的System32目录。
修复方案
二选一即可:
- 调整项目编译配置:将目标平台改为x64,或者使用Any CPU同时取消勾选「首选32位」选项,让程序以64位进程运行,就不会触发文件系统重定向
- 若必须保留32位编译目标,可以在调用启动逻辑前临时关闭重定向,执行完成后恢复,参考代码如下:
using System.Diagnostics; using System.Runtime.InteropServices; [DllImport("kernel32.dll", SetLastError = true)] private static extern bool Wow64DisableWow64FsRedirection(ref IntPtr oldRedirectionState); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool Wow64RevertWow64FsRedirection(IntPtr oldRedirectionState); // 启动firewall.cpl的调用逻辑 IntPtr state = IntPtr.Zero; try { Wow64DisableWow64FsRedirection(ref state); Process.Start(@"C:\Windows\System32\firewall.cpl"); } finally { Wow64RevertWow64FsRedirection(state); }
内容的提问来源于stack exchange,提问作者Wishy
相关产品推荐
相关产品推荐

