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
目录:
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.Is64BitOperatingSystem
或Environment.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