使用 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 输出
我用 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 输出