【问题标题】:C# - How to get Program Files (x86) on Windows 64 bitC# - 如何在 Windows 64 位上获取程序文件 (x86)
【发布时间】:2010-09-16 16:30:09
【问题描述】:

我正在使用:

FileInfo(
    System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.ProgramFiles) 
    + @"\MyInstalledApp"

为了确定是否在用户机器上检测到程序(这并不理想,但我正在寻找的程序是 MS-DOS 应用程序的正确旧组合,我想不出另一种方法)。

在 Windows XP 和 32 位版本的 Windows Vista 上,这可以正常工作。但是,在 x64 Windows Vista 上,代码返回 x64 Program Files 文件夹,而应用程序安装在 Program Files x86 中。有没有办法以编程方式返回 Program Files x86 的路径而无需硬连线“C:\Program Files (x86)”?

【问题讨论】:

  • 值得注意的是,这仅在 64 位操作系统上的 64 位应用程序中返回“程序文件”。如果您将应用程序专门编译为 x86,那么它将使用此代码在 64 位操作系统上返回“程序文件 (x86)”。

标签: c# windows file 64-bit


【解决方案1】:

C# 代码:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

输出:

C:\Program Files (x86)

注意:

我们需要告诉编译器不要偏爱特定的构建平台。

Go to Visual Studio > Project Properties > Build > Uncheck "Prefer 32 bit"

原因:

大多数 .NET 项目的默认设置是“任何 CPU 32 位首选”

当您取消选中 32 位汇编时:

在 32 位进程上 JIT 到 32 位代码

在 64 位进程上 JIT 到 32 位代码

【讨论】:

    【解决方案2】:

    在 .NET 中使用新方法的单线。将始终返回 x86 Program Files 文件夹。

    Environment.Is64BitOperatingSystem ? Environment.GetEnvironmentVariable("ProgramFiles(x86)") : Environment.GetEnvironmentVariable("ProgramFiles"))

    【讨论】:

      【解决方案3】:

      以下函数将在所有这三种 Windows 配置中返回 x86 Program Files 目录:

      • 32 位 Windows
      • 在 64 位 Windows 上运行的 32 位程序
      • 在 64 位窗口上运行的 64 位程序

       

      static string ProgramFilesx86()
      {
          if( 8 == IntPtr.Size 
              || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
          {
              return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
          }
      
          return Environment.GetEnvironmentVariable("ProgramFiles");
      }
      

      【讨论】:

      • 谁能评论这是否适用于本地化环境?在此先感谢...
      • 为什么要进行这个测试:8 == IntPtr.Size?
      • @Florian 这是一个检查 64 位进程的测试
      • 为什么不只是Environment.Is64BitOperatingSystemEnvironment.Is64BitProcess
      • @anustart 在 .NET 4.0 中提供这些方法之前,这已在 2008 年得到解答。
      【解决方案4】:

      我正在编写一个可以在 Windows 7 的 x86 和 x64 平台上运行的应用程序,查询以下变量只会在任何平台上提取正确的程序文件文件夹路径。

      Environment.GetEnvironmentVariable("PROGRAMFILES")
      

      【讨论】:

      • 真的,这也应该被标记为可接受的答案。这比执行逻辑测试要好得多。但是,它将返回适合应用程序编译位类型的文件夹。这意味着,如果您以 32 位编译应用程序,它将在 32 位操作系统上返回“程序文件”,在 64 位操作系统上返回“程序文件 (x86)”。完美!
      • 小心:问题是“如何在 Windows 64 位上获取程序文件 (x86)”而不是“如何获取正在运行的应用程序的正确程序文件夹”。因此,就功能而言,这个答案是正确的,不是问题的相关答案。
      【解决方案5】:

      但请注意,ProgramFiles(x86) 环境变量仅在您的应用程序运行 64 位时可用。

      如果您的应用程序运行 32 位,您可以只使用 ProgramFiles 环境变量,其值实际上是“Program Files (x86)”。

      【讨论】:

      • 确实如此。但是,很明显他的应用程序以 32 位运行的,否则 GetFolderPath() 无论如何都会返回正确的 x86 文件夹。
      • 非常有帮助!这只是节省了我几个小时的工作!并让人们不必使用我的代码。开箱即用,非常棒!
      【解决方案6】:

      如果您使用的是 .NET 4,则有一个特殊的文件夹枚举 ProgramFilesX86

      Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
      

      【讨论】:

      • 这在 32 位操作系统上表现如何?它是否返回没有 x86 的“c:\Program 文件”?
      • 是的。它将在 x86 上返回 c:\program 文件,在 64 位窗口上返回 c:\program 文件 (x86)。
      • 自己测试 - 在 Server 2003 32 位上,这将为我返回空字符串: Console.WriteLine("X86:" + System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86));
      • 在 Windows XP(32 位)上也返回空字符串
      • Microsoft 的文档指出:“在 x86 系统上,将 ProgramFilesX86 成员传递给 Environment.GetFolderPath 方法会返回 String.Empty;请改用 ProgramFiles 成员。您可以确定 Windows 是否为 32 位操作系统系统通过调用 Environment.Is64BitOperatingSystem 属性。"
      【解决方案7】:
      Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
      

      【讨论】:

        【解决方案8】:

        一种方法是查找“ProgramFiles(x86)”环境变量:

        String x86folder = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
        

        【讨论】:

          猜你喜欢
          • 2014-08-19
          • 2012-09-13
          • 1970-01-01
          • 2015-07-12
          • 1970-01-01
          • 2018-02-26
          • 2015-04-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多