如何在32位应用程序中获取64位"程序文件"目录

fir*_*mer 13 .net c# directory

我有一个以x86模式(在c#中)编译的应用程序,我需要从该文件访问存在于64位程序文件文件夹(当然是64位Windows)中的某个文件.我不想C:\Program Files在我的应用程序中将其硬编码为字符串,因为一些目标计算机可能在不同的驱动器中安装了Windows,或者可能使用其他语言.

我遇到的问题是使用Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)返回x86 flavor而不是所需的目录,除非我在64位模式下编译我的程序.出于好奇,我该怎么办才能避免这样做?

Nac*_*ota 5

项目属性中有一个名为“首选 32 位”的选项。取消选中该选项即可解决问题。尽管如此,我仍然对代码解决方案而不是这个感兴趣。

我实际上认为在构建选项上禁用Prefer 32bit是更好的方法。如果您不希望您的程序被视为 32 位进程,为什么不将其设为 64 位进程并为自己省去一些麻烦。

另请参阅Raymond Chen 关于该主题的这篇文章

话虽如此,ProgramW6432当我尝试使用 griddoor 建议的环境变量时,它对我来说效果很好。

  • 注意他们说“除非我在 64 位模式下编译我的程序”?这意味着他们知道他们可以将其切换为 64 位应用程序,我认为可以安全地假设他们不想或不能这样做。您不只是将 32 位应用程序切换到 64 位应用程序,这样您就可以更轻松地找到 64 位 Program Files 目录。这应该是一个刻意的改变,不应该掉以轻心,也不应该出于这种愚蠢的原因而做。保持 32 位有非常真实的原因,例如需要使用 32 位本机库。 (2认同)
  • @GregCobb 是的,我还注意到(几年前,当这篇文章写完时),在评论中有人建议取消选中“首选 32 位”之后,OP 写道“那就成功了”,但仍然对代码解决方案感兴趣。既然如此,我在回答中指出“ProgramW6432”环境变量似乎对我有用,所以OP也许应该尝试一下。鉴于提出该建议的评论获得了赞同,我认为它也对其他人有效。 (2认同)

Ron*_*yer 1

鉴于您可以合理地放心:

  1. Program Files 目录与系统安装在同一驱动器上。
  2. 对于 x64 和 x86,它们被命名为 Program Files,对于 x64,它们被命名为 Program Files (x86)。

然后你可以做这样的事情:

    public static void Main(string[] args)
    {
        string baseDirectory = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));
        string programFiles = "Program Files";
        string programFilesX86 = "Program Files (x86)";

        Console.WriteLine(Environment.Is64BitProcess ? "64-Bit Process" : "32-Bit Process");

        if (Environment.Is64BitOperatingSystem)
        {
            Console.WriteLine("64-bit operating system");
            Console.WriteLine("Program Files Directory: " + Path.Combine(baseDirectory, programFiles));
            Console.WriteLine("Program Files x86 Directory: " + Path.Combine(baseDirectory, programFilesX86));
        }
        else
        {
            Console.WriteLine("32-bit operating system");
            Console.WriteLine("Program Files Directory: " + Path.Combine(baseDirectory, programFiles));
        }
        
        Console.ReadKey(true);
    }
Run Code Online (Sandbox Code Playgroud)

不过,有一点需要注意:

程序文件目录可以更改,尽管 Microsoft 不支持此操作并且可能会导致其他系统问题。

因此,我会很好地跟踪这些内容Directory.Exists,如果您没有找到它们,那么您可以在注册表中查找。您正在寻找的钥匙是:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\

  • 程序文件目录
  • 程序文件目录(x86)

但同样,对于注册表访问,有一些难以理解的警告,在使用该类时Registry,它将根据请求它的进程的处理器体系结构选择 64 位或 32 位注册表。您可以指定 64 位目录。不想太深入,有很多关于如何读取注册表的教程。

另请注意,这仅适用于 Windows Vista 及更高版本,我不记得奇怪的 Windows XP-64 或旧版本的 Windows Server 是如何处理它的。

最后要注意的是,Linux/Android/iOS(又名 Mono 兼容操作系统或微框架)没有“Program Files”目录,因此请确保您意识到您正在此处编写操作系统特定的代码。如果您想让它与操作系统更加无关,请考虑编写一个函数,该函数可以根据默认安装目录的当前操作系统返回字符串数组。