C # - So erhalten Sie Programmdateien (x86) unter Windows 64-Bit

153

Ich benutze:

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

Um festzustellen, ob ein Programm auf einem Computer des Benutzers erkannt wird (es ist nicht ideal, aber das Programm, das ich suche, ist ein richtiger alter Kludge einer MS-DOS-Anwendung, und ich konnte mir keine andere Methode vorstellen).

Unter Windows XP und 32-Bit-Versionen von Windows Vista funktioniert dies einwandfrei. Unter x64 Windows Vista gibt der Code jedoch den Ordner x64-Programmdateien zurück, während die Anwendung in Programme 86 installiert ist. Gibt es eine Möglichkeit, den Pfad zu Programmdateien x86 ohne feste Verkabelung "C: \ Programme (x86)" programmgesteuert zurückzugeben?

Leonard H. Martin
quelle
9
Es ist erwähnenswert, dass dies die "Programmdateien" nur in 64-Bit-Anwendungen unter 64-Bit-Betriebssystemen zurückgibt. Wenn Sie Ihre Anwendung speziell als x86 kompilieren, gibt sie unter 64-Bit-Betriebssystem mit diesem Code "Programme (x86)" zurück.
VitalyB

Antworten:

230

Die folgende Funktion gibt das x86- Program FilesVerzeichnis in allen drei Windows-Konfigurationen zurück:

  • 32 Bit Windows
  • 32-Bit-Programm unter 64-Bit-Windows
  • 64-Bit-Programm, das unter 64-Bit-Fenstern ausgeführt wird

 

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}
JaredPar
quelle
1
Kann jemand kommentieren, ob dies in einer lokalisierten Umgebung funktioniert? Vielen Dank im Voraus ...
Tom
Warum dieser Test: 8 == IntPtr.Size?
Florian
1
@ Florian es ist ein Test, um nach einem 64-Bit-Prozess zu
suchen
10
Warum nicht einfach Environment.Is64BitOperatingSystemoder Environment.Is64BitProcess?
Osvein
7
@anustart Dies wurde 2008 beantwortet, bevor diese Methoden in .NET 4.0 verfügbar waren.
Rotem
135

Wenn Sie .NET 4 verwenden, gibt es eine spezielle Ordneraufzählung ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
Nathan
quelle
2
Wie verhält sich das auf einem 32-Bit-Betriebssystem? Gibt es "c: \ Programme" ohne x86 zurück?
Marcel Gosselin
6
Ja. Es werden c: \ Programme unter x86 und c: \ Programme (x86) unter 64-Bit-Fenstern zurückgegeben.
Nathan
2
Testen Sie es selbst - auf Server 2003 32-Bit wird für mich eine leere Zeichenfolge zurückgegeben: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison
4
Gibt auch eine leere Zeichenfolge unter Windows XP (32 Bit) zurück
Patrick McDonald
12
In der Dokumentation von Microsoft heißt es: "Auf einem x86-System gibt die Übergabe des ProgramFilesX86-Mitglieds an die Environment.GetFolderPath-Methode String.Empty zurück. Verwenden Sie stattdessen das ProgramFiles-Mitglied. Sie können feststellen, ob Windows ein 32-Bit-Betriebssystem ist, indem Sie die Environment.Is64BitOperatingSystem-Eigenschaft aufrufen . "
Goodies4uall
42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
Carl Hörberg
quelle
14

Beachten Sie jedoch, dass die ProgramFiles(x86)Umgebungsvariable nur verfügbar ist, wenn in Ihrer Anwendung 64-Bit ausgeführt wird.

Wenn Ihre Anwendung 32-Bit ausführt, können Sie einfach die ProgramFilesUmgebungsvariable verwenden, deren Wert tatsächlich "Programme (x86)" ist.

Chadmyers
quelle
Wahr genug. Es ist jedoch offensichtlich , dass seine Anwendung wird als 32-Bit ausgeführt wird , sonst GetFolderPath () würde bereits das Recht x86 Ordner sowieso zurückkehren.
Thomasr
Sehr hilfreich! Das hat mir nur Stunden Arbeit erspart! und rettete die Leute davor, meinen Code verwenden zu müssen. Es ist großartig, wenn die Dinge sofort funktionieren!
David Silva Smith
9

Eine Möglichkeit wäre, nach der Umgebungsvariablen "ProgramFiles (x86)" zu suchen:

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

Ich schreibe eine Anwendung, die sowohl auf der x86- als auch auf der x64-Plattform für Windows 7 ausgeführt werden kann, und beim Abfragen der folgenden Variablen wird nur der richtige Pfad für Programmordner auf jeder Plattform abgerufen.

Environment.GetEnvironmentVariable("PROGRAMFILES")
Samir
quelle
Wirklich, dies sollte auch als akzeptable Antwort markiert werden. Dies ist viel besser als das Durchführen von Logiktests. Es wird jedoch der Ordner zurückgegeben, der für den kompilierten Bittyp der App geeignet ist. Wenn Sie die App in 32-Bit-Betriebssystem kompiliert haben, werden auf einem 32-Bit-Betriebssystem "Programme" und auf einem 64-Bit-Betriebssystem "Programme (x86)" zurückgegeben. PERFEKT!
DiscipleMichael
Seien Sie vorsichtig: Die Frage lautet "So erhalten Sie Programmdateien (x86) unter Windows 64 Bit" und nicht "So erhalten Sie den richtigen Programmdateiordner der laufenden Anwendung". Diese Antwort, die in Bezug auf die Funktionalität richtig ist, ist also keine relevante Antwort auf die Frage.
Tedebus
0

Einzeiler mit der neuen Methode in .NET. Gibt immer den Ordner x86-Programmdateien zurück.

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

Roter John
quelle
0

C # -Code:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Ausgabe:

C: \ Programme (x86)

Hinweis:

Wir müssen dem Compiler mitteilen, dass er eine bestimmte Build-Plattform nicht bevorzugen soll.

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

Grund:

Standardmäßig ist für die meisten .NET-Projekte "Beliebige CPU 32-Bit bevorzugt".

Wenn Sie die 32-Bit-Assembly deaktivieren, wird Folgendes ausgeführt:

JIT zu 32-Bit-Code bei 32-Bit-Prozess

JIT zu 32-Bit-Code bei 64-Bit-Prozess

Clint
quelle