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


153

我正在使用:

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

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

在Windows XP和32位版本的Windows Vista上,此功能正常。但是,在x64 Windows Vista上,代码返回x64程序文件文件夹,而应用程序安装在程序文件x86中。有没有一种方法可以通过编程方式将路径返回到x86程序文件,而无需硬接线“ C:\ Program Files(x86)”?


9
值得注意的是,这仅在64位OS上的64位应用程序中返回“程序文件”。如果您将应用程序专门编译为x86,则它将使用此代码在64位OS上返回“程序文件(x86)”。
VitalyB '02 -2-8

Answers:


230

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

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

 

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

1
任何人都可以评论这是否在本地化环境中起作用吗?在此先感谢...
汤姆(Tom)2010年

为什么进行此测试:8 == IntPtr.Size?
Florian

1
@Florian这是检查64位进程的一种测试
JaredPar

10
为什么不直接Environment.Is64BitOperatingSystemEnvironment.Is64BitProcess
osvein 2013年

7
@anustart在.NET 4.0中提供这些方法之前,它在2008年得到了回答。
Rotem

135

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

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
在32位操作系统上该如何表现?它是否在没有x86的情况下返回“ c:\ Program files”?
Marcel Gosselin

6
是。它将在x86上返回c:\ program文件,在64位Windows上返回c:\ program文件(x86)。
内森

2
自己进行测试-在Server 2003 32位上,这将为我返回空字符串:Console.WriteLine(“ X86:” + System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)));
David Eison 2011年

4
在Windows XP(32位)上也返回空字符串
Patrick McDonald

12
Microsoft的文档指出:“在x86系统上,将ProgramFilesX86成员传递给Environment.GetFolderPath方法将返回String.Empty;请改用ProgramFiles成员。您可以通过调用Environment.Is64BitOperatingSystem属性来确定Windows是否为32位操作系统。 ”。
goodies4uall

42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)

14

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

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


足够真实。然而,很明显,他的申请运行为32位,否则GetFolderPath()将已经被无论如何返回正确的x86文件夹。
tomasr

很有帮助!这只是节省了我的工作时间!并使人们不必使用我的代码。开箱即用,太好了!
大卫·席尔瓦·史密斯

9

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

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

5

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

Environment.GetEnvironmentVariable("PROGRAMFILES")

确实,这也应标记为可接受的答案。这比执行逻辑测试好得多。但是,它将返回适合于应用程序的已编译位类型的文件夹。这意味着,如果您以32位编译应用程序,则它将在32位OS上返回“程序文件”,在64位OS上返回“程序文件(x86)”。完善!
弟子

注意:问题是“如何在Windows 64位上获取程序文件(x86)”,而不是“如何获取正在运行的应用程序的正确程序文件文件夹”。因此,就功能而言正确的答案与该问题无关。
tedebus

0

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

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


0

C#代码:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

输出:

C:\ Program档案(x86)

注意:

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

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

原因:

对于大多数.NET项目,默认情况下是“首选任何32位CPU”

取消选中32位汇编时,将:

在32位进程上将JIT转换为32位代码

在64位进程上将JIT转换为32位代码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.