1

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

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

但是,当我使用以下代码时,File.Exists 方法总是返回 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
4

1 回答 1

4

我做了一个快速测试,结果证明如果您使用的是 x64,则在fileExists返回x86 和任何 CPUFalse时返回True。至于原因,我不知道,但既然您打算在 32 位应用程序上使用它,那么只需使用 x86。确保选择 x86,以免任何 CPU 错误地选择 x64。

埃克森:

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

代码

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

在任何 CPU 上运行,仅当您在平台目标上选中“首选 32 位”(参见上面的屏幕截图)时,Sysnative 才能工作并且 File.Exists 返回 true

x86/任何 CPU 输出

在此处输入图像描述

x64 输出

在此处输入图像描述

于 2017-11-08T01:31:34.200 回答