You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:06:22