使用32位应用程序C#中的Sysnative和%windir%检查System32中的File.Exists

时间:2017-11-08 00:41:02

标签: c# windows 32bit-64bit system32

我在C#中创建了一个32位应用程序。因为它是32位,所以它无法访问64位位置,例如C:\ Windows \ System32。要访问64位位置,我知道我需要使用C:\ Windows \ Sysnative。

我想检查System32中是否存在文件。我在那里放了一个文件,可以在我的文件浏览器中查看它,所以我知道它存在。

但是,当我使用以下代码时,File.Exists方法始终返回false。 Sysnative似乎根本没有重定向。如何使用%windir%和Sysnative的File.Exists从32位应用程序中查找System32中的文件?

string fileName = "someFile.dll";
string path = Environment.ExpandEnvironmentVariables(@"%windir%\Sysnative\" + fileName);
//path should be 'C:\Windows\System32\'+fileName;

bool fileExists = File.Exists(path); //Always returns false

1 个答案:

答案 0 :(得分:3)

我做了一个快速测试,事实证明,如果你使用的是x64,那么fileExists会返回False,而x86和任何CPU都会返回True。至于原因,我不知道,但既然你计划在32位应用程序上使用它,那么只需使用x86。确保选择x86,以便Any CPU不会错误地选择x64。

<强> eryksun:

  

原因很简单,“SysNative”不是真正的目录。它得到了   通过WOW64仿真重定向到真正的“System32”目录   系统。只有通过WOW64在64位Windows上运行的32位应用程序   可以使用此虚拟目录。 32位应用程序,运行在32位上   Windows无法使用“SysNative”,因此必须尝试使用​​“System32”   一个32位的应用程序。

<强> CODE

class Program
{
    static void Main(string[] args)
    {
        string fileName = "aeevts.dll";
        string path = Environment.ExpandEnvironmentVariables(@"%windir%\Sysnative\" + fileName);
        //path should be 'C:\Windows\System32\'+fileName;

        Console.WriteLine(path);

        bool fileExists = File.Exists(path); //Always returns false

        Console.WriteLine(fileExists);

        Console.Read();
    }
}

<强>属性

enter image description here

<强> OP

  

在任何CPU上运行,只有在您选择“更喜欢32位”时才会运行   平台目标(见上面的截图)将是Sysnative的工作和   File.Exists返回true

x86 /任何CPU输出

enter image description here

x64输出

enter image description here