C# - Как получить программные файлы (x86) в Windows 64 бит

Я использую:

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. Есть ли способ программно вернуть путь к Program Files x86 без жесткого подключения "C:\Program Files (x86)"?

7 ответов

Решение

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

  • 32-битная Windows
  • 32-битная программа работает на 64-битной Windows
  • 64-битная программа работает на 64-битных окнах

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

Если вы используете.NET 4, существует специальное перечисление папок ProgramFilesX86:

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

Обратите внимание, однако, что ProgramFiles(x86) Переменная окружения доступна только в том случае, если ваше приложение работает в 64-битном режиме.

Если ваше приложение работает 32-битным, вы можете просто использовать ProgramFiles переменная окружения, значением которой на самом деле будет "Program Files (x86)".

Одним из способов будет поиск переменной среды ProgramFiles(x86):

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

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

Environment.GetEnvironmentVariable("PROGRAMFILES")

Однострочное использование нового метода в.NET. Всегда будет возвращать папку Program Files x86.

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

Код C#:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Выход:

C:\Program Files (x86)

Заметка:

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

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

Причина:

По умолчанию для большинства проектов.NET выбрано "Любой 32-разрядный процессор".

При снятии флажка 32-битная сборка:

JIT в 32-битный код в 32-битном процессе

JIT в 32-битный код в 64-битном процессе

Другие вопросы по тегам