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

Check File.Exists in System32 with Sysnative and %windir% from 32-bit app C#

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

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

然而,当我使用下面的代码时,File.Exists 方法总是 returns false。 Sysnative 似乎根本没有重定向。我如何将 File.Exists 与 %windir% 和 Sysnative 一起使用以从 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

我做了一个快速测试,结果表明,如果您使用的是 x64,则 fileExists returns False 而 x86 则 returns True和任何 CPU。至于为什么,我不知道,但既然你打算在 32 位应用程序上使用它,那么只需使用 x86。确保选择 x86,这样 Any CPU 就不会错误地选择 x64。

eryksun:

The reason is simply that "SysNative" isn't a real directory. It gets redirected to the real "System32" directory by the WOW64 emulation system. Only 32-bit applications running on 64-bit Windows via WOW64 can use this virtual directory. A 32-bit application running on 32-bit Windows cannot use "SysNative", so "System32" has to be tried even in a 32-bit app.

代码

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();
    }
}

属性

OP

Running on Any CPU, only if you have 'prefer 32-bit' checked on the Platform Target (see above screenshot) will Sysnative work and the File.Exists returns true

x86/Any CPU 输出

x64 输出