C# - 如何在 Windows 64 位上获取程序文件 (x86)

Posted

技术标签:

【中文标题】C# - 如何在 Windows 64 位上获取程序文件 (x86)【英文标题】:C# - How to get Program Files (x86) on Windows 64 bit 【发布时间】: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)”。 【参考方案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)");

【讨论】:

以上是关于C# - 如何在 Windows 64 位上获取程序文件 (x86)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 7 64 位上安装 PyOpenSSL?

如何在 Windows 7 64 位上设置 MinGw? [关闭]

我应该在 Windows 64 位上与 sass 一起使用哪个 ruby​​ 版本

如何在Windows 2008 R2 64位上部署提供程序SQLOLEDB.1

QGLWidget 在 Windows 7 64 位中显示为黑色 [重复]

如何签署我的驱动程序以使其安装在 Windows 7 64 位上?