C # - Come ottenere i file di programma (x86) su Windows a 64 bit


153

Sto usando:

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

Al fine di determinare se un programma viene rilevato su un computer degli utenti (non è l'ideale, ma il programma che sto cercando è un vecchio kludge giusto di un'applicazione MS-DOS, e non riuscivo a pensare a un altro metodo).

Su Windows XP e versioni a 32 bit di Windows Vista funziona perfettamente. Tuttavia, su Windows Vista x64 il codice restituisce la cartella Programmi x64, mentre l'applicazione è installata in Programmi x86. Esiste un modo per restituire programmaticamente il percorso a Program Files x86 senza cablaggio "C: \ Program Files (x86)"?


9
Vale la pena notare che questo restituisce i "File di programma" solo nell'applicazione a 64 bit sul sistema operativo a 64 bit. Se si compila l'applicazione in modo specifico come x86, verrà restituito "Programmi (x86)" sul sistema operativo a 64 bit utilizzando questo codice.
VitalyB,

Risposte:


230

La funzione seguente restituirà la Program Filesdirectory x86 in tutte queste tre configurazioni di Windows:

  • Windows a 32 bit
  • Programma a 32 bit in esecuzione su Windows a 64 bit
  • Programma a 64 bit in esecuzione su Windows a 64 bit

 

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

1
Qualcuno può commentare se questo funziona in un ambiente localizzato? Grazie in anticipo ...
Tom,

Perché questo test: 8 == IntPtr.Size?
Florian,

1
@Florian è un test per verificare la presenza di un processo a 64 bit
JaredPar,

10
Perché non solo Environment.Is64BitOperatingSystemo Environment.Is64BitProcess?
Osvein,

7
@anustart Questa è stata risposta nel 2008, prima che quei metodi fossero disponibili in .NET 4.0.
Rotem,

135

Se si utilizza .NET 4, esiste una speciale enumerazione delle cartelle ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
Come si comporta su un sistema operativo a 32 bit? Restituisce "c: \ Programmi" senza x86?
Marcel Gosselin,

6
Sì. Restituirà i file c: \ program su x86 e c: \ program (x86) su Windows a 64 bit.
Nathan

2
Provalo tu stesso - su Server 2003 a 32 bit, questo restituisce una stringa vuota per me: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison,

4
Restituisce anche una stringa vuota su Windows XP (32 bit)
Patrick McDonald

12
La documentazione di Microsoft afferma: "Su un sistema x86, passando il membro ProgramFilesX86 al metodo Environment.GetFolderPath restituisce String.Empty; utilizzare invece il membro ProgramFiles. È possibile determinare se Windows è un sistema operativo a 32 bit chiamando la proprietà Environment.Is64BitOperatingSystem ".
goodies4uall

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

14

Si noti, tuttavia, che la ProgramFiles(x86)variabile di ambiente è disponibile solo se l'applicazione è in esecuzione a 64 bit.

Se l'applicazione è in esecuzione a 32 bit, è possibile utilizzare semplicemente la ProgramFilesvariabile di ambiente il cui valore sarà in realtà "Programmi (x86)".


Abbastanza vero. Tuttavia, è ovvio che la sua applicazione è in esecuzione a 32 bit, altrimenti GetFolderPath () restituirebbe comunque la cartella x86 corretta.
tomasr,

Molto utile! questo mi ha fatto risparmiare ore di lavoro! e ha salvato la gente dal dover usare il mio codice. È fantastico quando le cose vanno fuori dagli schemi!
David Silva Smith,

9

Un modo sarebbe cercare la variabile d'ambiente "ProgramFiles (x86)":

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

5

Sto scrivendo un'applicazione che può essere eseguita su entrambe le piattaforme x86 e x64 per Windows 7 e l'interrogazione della variabile di seguito tira semplicemente il giusto percorso della cartella dei file di programma su qualsiasi piattaforma.

Environment.GetEnvironmentVariable("PROGRAMFILES")

Davvero, anche questa dovrebbe essere contrassegnata come una risposta accettabile. Questo è molto meglio che eseguire test logici. Tuttavia, restituirà la cartella appropriata per il tipo di bit compilato dell'app. Ciò significa che, se hai compilato l'app a 32 bit, restituirà "Programmi" su un sistema operativo a 32 bit e "Programmi (x86)" su un sistema operativo a 64 bit. PERFETTO!
Discepolo

Fai attenzione: la domanda è "Come ottenere i file di programma (x86) su Windows a 64 bit" e non "Come ottenere la cartella corretta dei file di programma dell'applicazione in esecuzione". Quindi questa risposta, che è giusta in termini di funzionalità, non è una risposta pertinente alla domanda.
Tedebus,

0

One-liner usando il nuovo metodo in .NET. Restituirà sempre la cartella dei file di programma x86.

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


0

Codice C #:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Produzione:

C: \ Programmi (x86)

Nota:

Dobbiamo dire al compilatore di non preferire una particolare piattaforma di compilazione.

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

Motivo:

Per impostazione predefinita per la maggior parte dei progetti .NET è "Qualsiasi CPU a 32 bit preferita"

Quando si deseleziona l'assieme a 32 bit:

JIT su codice a 32 bit su processo a 32 bit

JIT su codice a 32 bit su processo a 64 bit

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.