C # - Як отримати програмні файли (x86) на Windows 64 біт


153

Я використовую:

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

Для того, щоб визначити, чи виявлена ​​програма на машині користувачів (це не ідеально, але програма, яку я шукаю, - це старий правильний глузд програми MS-DOS, і я не міг придумати інший метод).

У Windows XP та 32-бітних версіях Windows Vista це чудово працює. Однак у x64 Windows Vista код повертає папку Program Files x64, тоді як додаток встановлено у Program Files x86. Чи є спосіб програмно повернути шлях до програмних файлів x86 без жорсткої проводки "C: \ Program Files (x86)"?


9
Варто зазначити, що це повертає "Програмні файли" лише в 64-бітній програмі на 64-бітній ОС. Якщо ви компілюєте свою програму конкретно як x86, вона повертає "Програмні файли (x86)" на 64-бітній ОС за допомогою цього коду.
ВіталійБ

Відповіді:


230

Функція нижче поверне Program Filesкаталог x86 у всіх цих трьох конфігураціях Windows:

  • 32-бітна Windows
  • 32-бітна програма, що працює на 64-бітної Windows
  • 64-бітна програма, що працює на 64-бітних Windows

 

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

1
Чи може хтось прокоментувати, чи працює це в локалізованому середовищі? Заздалегідь дякую ...
Том

Чому цей тест: 8 == IntPtr.Size?
Флоріан

1
@Florian це тест на перевірку 64-бітного процесу
JaredPar

10
Чому б не просто Environment.Is64BitOperatingSystemчи Environment.Is64BitProcess?
osvein

7
@anustart На це відповіли в 2008 році, перш ніж ці методи були доступні в .NET 4.0.
Ротем

135

Якщо ви використовуєте .NET 4, існує спеціальний перелік папок ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
Як це поводиться на 32-бітній ОС? Чи повертається "c: \ програмні файли" без x86?
Марсель Госселін

6
Так. Він поверне c: \ програмні файли на x86 та c: \ програмні файли (x86) на 64-бітні вікна.
Натан

2
Перевірте сам - на сервері 2003 32 біт, це повертає для мене порожню рядок: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
Девід Ейсон

4
Також повертає порожній рядок у Windows XP (32 біт)
Патрік Макдональд,

12
У документації Microsoft зазначено: "У системі x86 передача елемента ProgramFilesX86 в середовище Environment.GetFolderPath метод повертає String.Empty; замість цього використовується член ProgramFiles. Ви можете визначити, чи є Windows 32-розрядною операційною системою, викликавши властивість Environment.Is64BitOperatingSystem. . "
goodies4uall


14

Однак зауважте, що ProgramFiles(x86)змінна середовища доступна лише в тому випадку, якщо ваша програма працює на 64-розрядному рівні.

Якщо у вашій програмі працює 32-розрядна, ви можете просто використовувати ProgramFilesзмінну середовища, значення якої насправді буде "Програмні файли (x86)".


Правда досить. Тим НЕ менше, очевидно , що його застосування буде запущений як 32-бітових, в іншому випадку GetFolderPath () буде вже повертатися потрібну папку x86 в будь-якому випадку.
tomasr

Дуже корисний! це просто врятувало мені години роботи! і врятувало людей від використання мого коду. Чудово, коли все виходить з коробки!
Девід Сільва Сміт

9

Одним із способів було б шукати змінну середовища "ProgramFiles (x86)":

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

5

Я пишу заявку, яка може працювати на платформах x86 та x64 для Windows 7, і запит на нижчу змінну просто тягне правильний шлях папки програмних файлів на будь-якій платформі.

Environment.GetEnvironmentVariable("PROGRAMFILES")

Дійсно, це також слід позначити як прийнятну відповідь. Це набагато краще, ніж виконання логічних тестів. Однак вона поверне папку, відповідну для компільованого бітового типу програми. Значить, якщо ви склали додаток у 32-бітній версії, він поверне "Програмні файли" на 32-бітної ОС та "Програмні файли (x86)" на 64-бітній ОС. ЗДОРОВИЙ!
DiscipleMichael

Будьте уважні: питання "Як отримати програмні файли (x86) на Windows 64 біт", а не "Як отримати потрібну папку програмного файлу запущеного додатка". Тож ця відповідь, правильна з точки зору функціональності, не є відповідною відповіддю на питання.
тедебус

0

Однолінійний з використанням нового методу в .NET. Завжди повертає папку програмних файлів x86.

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


0

C # код:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Вихід:

C: \ програмні файли (x86)

Примітка:

Нам потрібно сказати компілятору не віддати перевагу певній платформі збірки.

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

Причина:

За замовчуванням для більшості .NET проектів є "Будь-який 32-бітний процесор бажаний"

Якщо ви знімите 32-бітну збірку, виконайте такі дії:

32-розрядний код JIT в 32-бітовому процесі

32-розрядний код JIT в 64-бітовому процесі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.