我在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
答案 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();
}
}
<强>属性强>
<强> OP 强>
在任何CPU上运行,只有在您选择“更喜欢32位”时才会运行 平台目标(见上面的截图)将是Sysnative的工作和 File.Exists返回true
x86 /任何CPU输出
x64输出