繁体   English   中英

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

[英]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方法始终返回false。 系统化似乎根本没有重定向。 如何在%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

我做了一个快速测试,结果发现,如果您使用的是x64,则fileExists返回False而x86和Any CPU则返回True 至于原因,我不知道,但是由于您打算在32位应用程序上使用它,因此只需使用x86。 确保选择x86,以便任何CPU都不会错误地选择x64。

eryksun:

原因很简单,“ 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上运行,只有在Platform Target上选中“ prefer 32-bit”(请参见上面的屏幕截图)时,Sysnative才能工作并且File.Exists返回true

x86 /任何CPU输出

在此处输入图片说明

x64输出

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM