c# Process.Start()找不到系统文件的解决方法

 更新时间:2023年09月06日 09:24:17   作者:yizhou2010  
vs1027在X64应用程序下执行process.start()时,OK;但是在X86应用程序下执行process.start(),报错:找不到系统文件,本文就详细的介绍一下解决方法,感兴趣的可以了解一下

问题描述

vs1027在X64应用程序下执行process.start()时,OK;但是在X86应用程序下执行process.start(),报错:找不到系统文件

if (kbpr.HasExited)
{
	kbpr = Process.Start(@"C:\Windows\System32\osk.exe");
}

网上搜索良久,发现原因为:windows重定向搞得鬼

在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制。目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与64位程序冲突;因此,32位应用程序的运行是通过WOW64的模拟器来实现的。WOW64 是一个由操作系统提供的兼容性环境,它使得 32 位应用程序能够在 Windows 64 位操作系统上运行,在系统的Windows目录下,存在System32和SysWOW64两个文件夹:

System32文件夹下存放的是64位DLL

SysWOW64文件夹下存放的是32位DLL

因此,如果我们用32位程序去访问c:\windows\system32,不管我们用硬编码还是其它的方式,系统都会自动地给我们转向到C:\windows\syswow64下面。

禁止系统的重定向的解决办法是调用下面的API函数

禁用系统重定向用下面的函数:
BOOL Wow64DisableWow64FsRedirection(PVOID OldValue);
恢复系统重定向用下面的函数:
BOOL Wow64RevertWow64FsRedirection(PVOID OldValue);

解决办法

具体代码如下:

// 关闭64位(文件系统)的操作转向
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
// 开启64位(文件系统)的操作转向
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
IntPtr oldWOW64State = new IntPtr();
Wow64DisableWow64FsRedirection(ref oldWOW64State);   // 关闭64位(文件系统)的操作转向
Wow64RevertWow64FsRedirection(oldWOW64State);        // 开启64位(文件系统)的操作转向

注1

网上还有中办法,将路径c:\windows\system32\改为c:\windows\sysnative\,但是我尝试,好像不管用;可能是需要注册表或者哪里设置过吧

注2

当然最简单的办法,是将应用程序改为64位,就不存在以上问题了。

【参考1】https://www.cnblogs.com/iamlucky/p/5998086.html

【参考2】https://www.bbsmax.com/A/mo5kj04KJw/

到此这篇关于c# Process.Start()找不到系统文件的解决方法的文章就介绍到这了,更多相关c# Process.Start()找不到系统文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#使用OpenCvSharp实现透视变换功能

    C#使用OpenCvSharp实现透视变换功能

    这篇文章主要为大家详细介绍了C#如何使用OpenCvSharp实现透视变换的功能,文中的示例代码简洁易懂,具有一定的学习价值,需要的小伙伴可以参考下
    2023-11-11
  • 详解Unity中的ShaderGraph入门使用教程

    详解Unity中的ShaderGraph入门使用教程

    Unity2018版本之后推出了一个可编程渲染管线工具ShaderGraph,让我们可以通过可视化界面拖拽来实现着色器的创建和编辑,今天重点给大家介绍Unity中的ShaderGraph入门使用教程,需要的朋友参考下吧
    2021-07-07
  • C#实现六大设计原则之里氏替换原则

    C#实现六大设计原则之里氏替换原则

    这篇文章介绍了C#实现六大设计原则之里氏替换原则的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • C#通过oledb访问access数据库的方法

    C#通过oledb访问access数据库的方法

    这篇文章主要介绍了C#通过oledb访问access数据库的方法,实例分析了C#操作access数据库的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#实现读取Word表格到DataSet

    C#实现读取Word表格到DataSet

    在应用项目里,多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求,但某些情况下,也存在使用 Word 进行表格数据编辑的情况,这其中也包括导入Word内容的功能,比如表格数据导出到DataSet数据集,本文将给大家介绍了C#读取Word表格到DataSet
    2023-12-12
  • C#实现员工ID卡的识别功能

    C#实现员工ID卡的识别功能

    这篇文章主要为大家详细介绍了C#如何实现识别员工ID卡的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-01-01
  • C#实现奇偶排序的示例代码

    C#实现奇偶排序的示例代码

    奇偶排序是一种简单的排序算法,该算法通过比较并交换相邻的元素来完成排序,本文主要介绍了C#实现奇偶排序的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • C#实现输入10个数存入到数组中并求max和min及平均数的方法示例

    C#实现输入10个数存入到数组中并求max和min及平均数的方法示例

    这篇文章主要介绍了C#实现输入10个数存入到数组中并求max和min及平均数的方法,涉及C#简单数据转换与数值运算相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • C#中OpenCVSharp实现轮廓检测

    C#中OpenCVSharp实现轮廓检测

    这篇文章主要介绍了C#中OpenCVSharp实现轮廓检测,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#委托与冒泡排序实例

    C#委托与冒泡排序实例

    这篇文章介绍了C#委托与冒泡排序的实例,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论