IntPtr.Size ne renverra pas la valeur correcte s'il est exécuté dans .NET Framework 2.0 32 bits sur Windows 64 bits (il retournerait 32 bits).
Comme le décrit Raymond Chen de Microsoft, vous devez d'abord vérifier s'il s'exécute dans un processus 64 bits (je pense que dans .NET, vous pouvez le faire en vérifiant IntPtr.Size), et si vous exécutez dans un processus 32 bits, vous avez toujours doivent appeler la fonction Win API IsWow64Process. Si cela retourne vrai, vous exécutez un processus 32 bits sur Windows 64 bits.
Raymond Chen de Microsoft:
comment détecter par programme si vous utilisez Windows 64 bits
Ma solution:
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;
}
}
Stefan Schultze
la source
System.Environment.Is64BitOperatingSystem
. Pouvez-vous le modifier dans votre réponse ou me donner la permission de le modifier dans votre réponse?.NET 4 possède deux nouvelles propriétés dans la classe Environnement, Is64BitProcess et Is64BitOperatingSystem . Fait intéressant, si vous utilisez Reflector, vous pouvez voir qu'ils sont implémentés différemment dans les versions 32 bits et 64 bits de mscorlib. La version 32 bits renvoie false pour Is64BitProcess et appelle IsWow64Process via P / Invoke pour Is64BitOperatingSystem. La version 64 bits renvoie juste vrai pour les deux.
la source
if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());
(pseudo-code)Is64BitProcess
etIs64BitOperatingSystem
(liens pour la version 2.0).Si vous utilisez .NET Framework 4.0, c'est simple:
Voir la propriété Environment.Is64BitOperatingSystem (MSDN).
la source
Ceci n'est qu'une implémentation de ce qui est suggéré ci-dessus par Bruno Lopez, mais fonctionne sur Win2k + tous les Service Packs WinXP. Je pensais juste que je le posterais pour que les autres ne l'aient pas roulé à la main. (aurait posté un commentaire, mais je suis un nouvel utilisateur!)
la source
La réponse complète est la suivante (tirée à la fois de stefan-mg, ripper234 et de la réponse de BobbyShaftoe):
Vérifiez d'abord si vous êtes dans un processus 64 bits. Si ce n'est pas le cas, vérifiez si le processus 32 bits est un processus Wow64.
la source
Microsoft a mis un exemple de code pour cela:
http://1code.codeplex.com/SourceControl/changeset/view/39074#842775
Cela ressemble à ceci:
Il existe également une version WMI (pour tester les machines distantes).
la source
Vous pouvez également vérifier la
PROCESSOR_ARCHITECTURE
variable d'environnement.Il n'existe pas ou est défini sur "x86" sous Windows 32 bits.
la source
prefer 32-bit
avecAny CPU
votre,Platform Target
vous obtiendrezx86
, mais si vous la décochezPrefer 32-bit
, vous l'obtiendrezAMD64
.Du blog de Chriz Yuen
C # .Net 4.0 Présentation de deux nouvelles propriétés d'environnement Environment.Is64BitOperatingSystem; Environment.Is64BitProcess;
Veuillez faire attention lorsque vous utilisez ces deux propriétés. Test sur Windows 7 64bits Machine
la source
La façon la plus rapide:
Remarque: ceci est très direct et fonctionne correctement sur 64 bits uniquement si le programme ne force pas l'exécution en tant que processus 32 bits (par exemple
<Prefer32Bit>true</Prefer32Bit>
dans les paramètres du projet).la source
Essaye ça:
la source
@foobar: Tu as raison, c'est trop facile;)
Dans 99% des cas, les développeurs ayant des antécédents d'administrateur système faibles ne parviennent finalement pas à réaliser le pouvoir que Microsoft a toujours fourni à quiconque pour énumérer Windows.
Les administrateurs système écriront toujours du code meilleur et plus simple à ce sujet.
Néanmoins, une chose à noter, la configuration de construction doit être AnyCPU pour que cette variable d'environnement renvoie les valeurs correctes sur les bons systèmes:
Cela renverra "X86" sur Windows 32 bits et "AMD64" sur Windows 64 bits.
la source
L'utilisation de dotPeek permet de voir comment le framework le fait réellement. Dans cet esprit, voici ce que j'ai trouvé:
Exemple d'utilisation:
la source
Utilisez ces deux variables d'environnement (pseudo-code):
Reportez-vous au billet de blog HOWTO: Detect Process Bitness .
la source
J'ai utilisé cette vérification avec succès sur de nombreux systèmes d'exploitation:
Ce dossier est toujours nommé "SysWOW64", quelle que soit la langue du système d'exploitation. Cela fonctionne pour .NET Framework 1.1 ou supérieur.
la source
SysWOW64
sur un%windir%
système d'exploitation 32 bits? La présence d'un dossier signifie exactement cela: que le dossier est présent.Je dois le faire, mais je dois également pouvoir en tant qu'administrateur le faire à distance, dans les deux cas, cela semble fonctionner très bien pour moi:
la source
Il s'agit d'une solution basée sur le code de Microsoft à l' adresse http://1code.codeplex.com/SourceControl/changeset/view/39074#842775 . Il utilise des méthodes d'extension pour une réutilisation facile du code.
Une utilisation possible est indiquée ci-dessous:
la source
Voici l'approche directe en C # en utilisant DllImport à partir de cette page .
la source
IsWow64Process
n'existe pas.J'utilise le code de suivi. Remarque: il est conçu pour un projet AnyCPU.
la source
J'ai trouvé que c'était la meilleure façon de vérifier la plate-forme du système et le processus:
La première propriété renvoie true pour un système 64 bits et false pour 32 bits. La deuxième propriété renvoie true pour le processus 64 bits et false pour 32 bits.
La nécessité de ces deux propriétés est que vous pouvez exécuter des processus 32 bits sur un système 64 bits, vous devrez donc vérifier à la fois le système et le processus.
la source
Très bien, mais cela devrait également fonctionner à partir de
env
:..
Trop facile, peut-être ;-)
la source
Voici une approche WMI ( Windows Management Instrumentation ):
la source
OSInfo.Bits
la source
Incluez le code suivant dans une classe de votre projet:
Utilisez-le comme ceci:
la source
Utilisez ceci pour obtenir l'architecture Windows installée:
la source
Étant donné que la réponse acceptée est très complexe. Il existe des moyens plus simples. Le mien est une variante de la réponse d'Alexandrudicu. Étant donné que les fenêtres 64 bits installent des applications 32 bits dans Program Files (x86), vous pouvez vérifier si ce dossier existe, en utilisant des variables d'environnement (pour compenser les différentes localisations)
par exemple
Pour moi, c'est plus rapide et plus simple. Étant donné que je souhaite également accéder à un chemin spécifique sous ce dossier en fonction de la version du système d'exploitation.
la source
Prendre plaisir ;-)
la source
Il suffit de voir si le "C: \ Program Files (x86)" existe. Sinon, vous êtes sur un système d'exploitation 32 bits. Si c'est le cas, le système d'exploitation est 64 bits (Windows Vista ou Windows 7). Cela semble assez simple ...
la source
J'utilise:
Cela permet d'accéder au chemin où votre application est lancée au cas où vous l'avez installée à différents endroits sur l'ordinateur. En outre, vous pouvez simplement suivre le
C:\
chemin général , car 99,9% des ordinateurs ont Windows installéC:\
.la source
J'utilise une version des éléments suivants:
la source