IntPtr.Size gibt nicht den richtigen Wert zurück, wenn es in 32-Bit-.NET Framework 2.0 unter 64-Bit-Windows ausgeführt wird (es würde 32-Bit zurückgeben).
Wie Raymond Chen von Microsoft beschreibt, müssen Sie zuerst prüfen, ob ein 64-Bit-Prozess ausgeführt wird (ich denke, in .NET können Sie dies durch Überprüfen von IntPtr.Size tun), und wenn Sie in einem 32-Bit-Prozess ausgeführt werden, müssen Sie dies immer noch tun müssen die Win-API-Funktion IsWow64Process aufrufen. Wenn dies true zurückgibt, werden Sie in einem 32-Bit-Prozess unter 64-Bit-Windows ausgeführt.
Raymond Chen von Microsoft:
So erkennen Sie programmgesteuert, ob Sie unter 64-Bit-Windows ausgeführt werden
Meine Lösung:
static bool is64BitProcess = (IntPtr.Size == 8);
static bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(
[In] IntPtr hProcess,
[Out] out bool wow64Process
);
public static bool InternalCheckIsWow64()
{
if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
Environment.OSVersion.Version.Major >= 6)
{
using (Process p = Process.GetCurrentProcess())
{
bool retVal;
if (!IsWow64Process(p.Handle, out retVal))
{
return false;
}
return retVal;
}
}
else
{
return false;
}
}
System.Environment.Is64BitOperatingSystem
. Können Sie dies in Ihrer Antwort bearbeiten oder mir die Erlaubnis geben, es in Ihrer Antwort zu bearbeiten?.NET 4 verfügt über zwei neue Eigenschaften in der Umgebungsklasse, Is64BitProcess und Is64BitOperatingSystem . Interessanterweise können Sie bei Verwendung von Reflector feststellen, dass diese in den 32-Bit- und 64-Bit-Versionen von mscorlib unterschiedlich implementiert sind. Die 32-Bit-Version gibt false für Is64BitProcess zurück und ruft IsWow64Process über P / Invoke für Is64BitOperatingSystem auf. Die 64-Bit-Version gibt für beide nur true zurück.
quelle
if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());
(Pseudocode)Is64BitProcess
undIs64BitOperatingSystem
(Links für Version 2.0) lesen .Wenn Sie .NET Framework 4.0 verwenden, ist dies ganz einfach:
Siehe Environment.Is64BitOperatingSystem-Eigenschaft (MSDN).
quelle
Dies ist nur eine Implementierung der oben von Bruno Lopez vorgeschlagenen Vorschläge, funktioniert jedoch mit Win2k + allen WinXP-Service Packs. Ich dachte nur, ich würde es posten, damit andere Leute es nicht von Hand rollen mussten. (hätte als Kommentar gepostet, aber ich bin ein neuer Benutzer!)
quelle
Die vollständige Antwort lautet wie folgt (sowohl aus Stefan-mg, Ripper234 als auch aus BobbyShaftoes Antwort):
Überprüfen Sie zunächst, ob Sie sich in einem 64-Bit-Prozess befinden. Wenn nicht, überprüfen Sie, ob der 32-Bit-Prozess ein Wow64-Prozess ist.
quelle
Microsoft hat hierfür ein Codebeispiel erstellt:
http://1code.codeplex.com/SourceControl/changeset/view/39074#842775
Es sieht aus wie das:
Es ist auch eine WMI-Version verfügbar (zum Testen von Remote-Computern).
quelle
Sie können auch nach der
PROCESSOR_ARCHITECTURE
Umgebungsvariablen suchen.Es existiert entweder nicht oder ist unter 32-Bit-Windows auf "x86" eingestellt.
quelle
prefer 32-bit
mitAny CPU
alsPlatform Target
dann erhalten Siex86
, aber wenn Sie untickPrefer 32-bit
es wird Ihnen dann erhaltenAMD64
.Aus dem Blog von Chriz Yuen
C # .Net 4.0 Einführung von zwei neuen Umgebungseigenschaften Environment.Is64BitOperatingSystem; Environment.Is64BitProcess;
Bitte seien Sie vorsichtig, wenn Sie diese beiden Eigenschaften nutzen. Test auf Windows 7 64-Bit-Computer
quelle
Schnellster Weg:
Hinweis: Dies ist sehr direkt und funktioniert unter 64-Bit nur dann ordnungsgemäß, wenn das Programm die Ausführung nicht als 32-Bit-Prozess erzwingt (z. B.
<Prefer32Bit>true</Prefer32Bit>
in den Projekteinstellungen).quelle
Versuche dies:
quelle
@foobar: Du hast recht, es ist zu einfach;)
In 99% der Fälle erkennen Entwickler mit einem schwachen Systemadministratorhintergrund letztendlich nicht, welche Leistung Microsoft immer für die Aufzählung von Windows bereitgestellt hat.
Systemadministratoren schreiben immer besseren und einfacheren Code, wenn es um einen solchen Punkt geht.
Beachten Sie jedoch, dass die Build-Konfiguration AnyCPU sein muss, damit diese Umgebungsvariable die richtigen Werte auf den richtigen Systemen zurückgibt :
Dies gibt "X86" unter 32-Bit-Windows und "AMD64" unter 64-Bit-Windows zurück.
quelle
Mithilfe von dotPeek können Sie sehen, wie das Framework dies tatsächlich tut. In diesem Sinne habe ich mir Folgendes ausgedacht:
Anwendungsbeispiel:
quelle
Verwenden Sie diese beiden Umgebungsvariablen (Pseudocode):
Weitere Informationen finden Sie im Blog-Beitrag HOWTO: Process Bitness erkennen .
quelle
Ich habe diesen Check mit Erfolg auf vielen Betriebssystemen verwendet:
Dieser Ordner heißt immer "SysWOW64", unabhängig von der Sprache des Betriebssystems. Dies funktioniert für .NET Framework 1.1 oder höher.
quelle
SysWOW64
auf ein%windir%
auf einem 32 - Bit - OS? Das Vorhandensein eines Ordners bedeutet genau das: dass der Ordner vorhanden ist.Ich muss dies tun, aber ich muss es auch als Administrator aus der Ferne tun können. In beiden Fällen scheint dies für mich ganz gut zu funktionieren:
quelle
Dies ist eine Lösung, die auf dem Microsoft-Code unter http://1code.codeplex.com/SourceControl/changeset/view/39074#842775 basiert . Es verwendet Erweiterungsmethoden für die einfache Wiederverwendung von Code.
Einige mögliche Verwendungszwecke sind unten aufgeführt:
quelle
Hier ist der direkte Ansatz in C # mit DllImport von dieser Seite .
quelle
IsWow64Process
es nicht existiert.Ich verwende den folgenden Code. Hinweis: Es wurde für ein AnyCPU-Projekt erstellt.
quelle
Ich fand, dass dies der beste Weg ist, um die Plattform des Systems und den Prozess zu überprüfen:
Die erste Eigenschaft gibt true für ein 64-Bit-System und false für 32-Bit zurück. Die zweite Eigenschaft gibt true für 64-Bit-Prozesse und false für 32-Bit-Prozesse zurück.
Diese beiden Eigenschaften sind erforderlich, da Sie 32-Bit-Prozesse auf einem 64-Bit-System ausführen können. Sie müssen daher sowohl nach dem System als auch nach dem Prozess suchen.
quelle
Alles in Ordnung, aber das sollte auch funktionieren von
env
:..
Vielleicht zu einfach ;-)
quelle
Hier ist ein WMI-Ansatz ( Windows Management Instrumentation ):
quelle
OSInfo.Bits
quelle
Fügen Sie den folgenden Code in eine Klasse in Ihrem Projekt ein:
Verwenden Sie es so:
quelle
Verwenden Sie diese Option, um die installierte Windows-Architektur abzurufen:
quelle
Angesichts der Tatsache, dass die akzeptierte Antwort sehr komplex ist. Es gibt einfachere Wege. Meins ist eine Variation von Alexandrudicus Antwort. Angesichts der Tatsache, dass 64-Bit-Fenster 32-Bit-Anwendungen in Programmdateien (x86) installieren, können Sie mithilfe von Umgebungsvariablen überprüfen, ob dieser Ordner vorhanden ist (um unterschiedliche Lokalisierungen auszugleichen).
z.B
Das ist für mich schneller und einfacher. Da ich auch auf einen bestimmten Pfad unter diesem Ordner zugreifen möchte, der auf der Betriebssystemversion basiert.
quelle
Genießen ;-)
quelle
Überprüfen Sie nur, ob "C: \ Programme (x86)" vorhanden ist. Wenn nicht, haben Sie ein 32-Bit-Betriebssystem. Wenn dies der Fall ist, ist das Betriebssystem 64-Bit (Windows Vista oder Windows 7). Es scheint einfach genug ...
quelle
Ich benutze:
Dadurch wird der Pfad abgerufen, in dem Ihre Anwendung gestartet wird, falls Sie sie an verschiedenen Stellen auf dem Computer installiert haben. Sie können auch einfach den allgemeinen
C:\
Pfad ausführen, da in 99,9% der Computer Windows installiert istC:\
.quelle
Ich benutze eine Version von Folgendem:
quelle