Comment détecter 64 bits de Windows plate-forme .NET?
Dans un .NET 2.0 application en C# j'utilise le code suivant pour détecter le système d'exploitation de la plateforme:
string os_platform = System.Environment.OSVersion.Platform.ToString();
Cela renvoie "Win32NT". Le problème est qu'il renvoie "Win32NT" même lors de l'exécution sur Windows Vista 64 bits.
Est-il une autre méthode pour connaître la plate-forme correcte (32 ou 64 bits)?
Noter qu'il faut également détecter 64 bits lors de l'exécuter comme une application 32 bits sur Windows 64 bits.
Vous devez vous connecter pour publier un commentaire.
IntPtr.La taille ne retourne pas la valeur correcte si l'exécution en 32 bits .NET Framework 2.0 sur Windows 64 bits (il serait de retour à 32 bits).
Que Microsoft Raymond Chen décrit, vous devez d'abord vérifier si l'exécution dans un processus 64 bits (je pense que dans .NET, vous pouvez le faire en cochant IntPtr.Taille), et si vous exécutez dans un processus 32 bits, vous devez toujours appeler la Victoire de la fonction de l'API IsWow64Process. Si cela renvoie true, vous sont en cours d'exécution dans un processus 32 bits sur 64 bits de Windows.
De Microsoft Raymond Chen:
Comment détecter par programme si vous êtes en cours d'exécution sur Windows 64 bits
Ma solution:
static
aux Propriétés bien 🙂 sinon a bien fonctionné pour moi, testé 32bit, 32on64, pure et 64 bits.System.Environment.Is64BitOperatingSystem
. Vous pouvez modifier cela dans votre réponse, ou de me donner la permission de monter dans votre réponse?.NET 4 a deux nouvelles propriétés dans la classe d'Environnement, Is64BitProcess et Is64BitOperatingSystem. Fait intéressant, si vous utilisez un Réflecteur vous pouvez le voir, ils sont mis en œuvre différemment dans le 32-bit & les versions 64 bits de mscorlib. La version 32 bits retourne la valeur false pour Is64BitProcess et les appels IsWow64Process via P/Invoke pour Is64BitOperatingSystem. La version 64 bits ne renvoie vrai pour les deux.
if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());
(pseudo-code)Is64BitProcess
etIs64BitOperatingSystem
(les liens pour la version 2.0).Si vous utilisez .NET Framework 4.0, c'est facile:
Voir De l'environnement.Is64BitOperatingSystem Propriété (MSDN).
C'est juste de la mise en œuvre de ce qui est suggéré ci-dessus, par Bruno Lopez, mais fonctionne sur Win2k + tous WinXP service packs. Juste pensé que je serais post afin que d'autres personnes n'ont pas de rouleau à la main. (aurait posté un commentaire, mais je suis un nouvel utilisateur!)
La réponse complète est présente (prises à partir de deux stefan-mg, ripper234 et BobbyShaftoe réponse):
Vérifiez d'abord si vous êtes en 64 bits processus. Si vous n'êtes pas, vérifiez si le processus 32 bits est un Wow64Process.
Microsoft a mis un exemple de code pour cela:
http://1code.codeplex.com/SourceControl/changeset/view/39074#842775
Il ressemble à ceci:
Il y a un WMI version disponible (pour le test des machines distantes).
Vous pouvez également consulter les
PROCESSOR_ARCHITECTURE
variable d'environnement.Il soit, n'existe pas, ou est réglé sur "x86" sur les 32 bits de Windows.
prefer 32-bit
avecAny CPU
que votrePlatform Target
alors vous obtiendrezx86
, mais si vous décochezPrefer 32-bit
il vous sera alorsAMD64
.De Chriz Yuen blog
C# .Net 4.0 a Introduit deux nouveaux propriété d'environnement
De l'environnement.Is64BitOperatingSystem;
De l'environnement.Is64BitProcess;
Soyez prudent lors de l'utilisation de ces biens.
Test sur Windows 7 64bits Machine
Essayez ceci:
Façon la plus rapide:
Remarque: c'est très direct.
@foobar: Vous avez raison, c'est trop facile 😉
Dans 99% des cas, les développeurs à la faiblesse de l'administrateur système milieux finalement ne parviennent pas à rendre compte de la puissance de Microsoft a toujours pour toute personne à énumérer les Fenêtres.
Les administrateurs système sera toujours écrire mieux et plus simple de code quand il s'agit d'un point.
Néanmoins, une chose à noter, configuration de build doit être AnyCPU pour cette variable d'environnement pour retourner les valeurs correctes sur les bons systèmes:
Ce sera le retour de "X86" sur les 32 bits de Windows, et "AMD64" sur une version 64 bits de Windows.
L'utilisation de ces deux variables d'environnement (pseudo-code):
Se référer à l'article du blog HOWTO: Processus de détection du nombre de bits.
À l'aide de dotPeek aide à voir la façon dont le cadre ne fait-il. Avec cela à l'esprit, voici ce que j'ai trouvé:
Exemple d'utilisation:
J'ai besoin de le faire, mais j'ai aussi besoin pour être en mesure à un admin de le faire à distance, soit en cas cela semble fonctionner assez bien pour moi:
C'est une solution basée sur Microsoft code à http://1code.codeplex.com/SourceControl/changeset/view/39074#842775. Il utilise des méthodes d'extension pour faciliter la réutilisation de code.
Certaines des utilisations possibles est indiqué ci-dessous:
J'ai utilisé cette case avec succès sur de nombreux systèmes d'exploitation:
Ce dossier est toujours nommé "SysWOW64", peu importe la langue du système d'exploitation. Cela fonctionne pour .NET Framework 1.1 ou supérieur.
SysWOW64
sur un%windir%
sur un OS 32 bits? La présence d'un dossier que veut dire exactement: que le dossier est présent.Ici est l'approche directe en C# à l'aide de DllImport de cette page.
IsWow64Process
n'existe pas.Je suis en utilisant le followin code. Remarque: Il est fait pour un AnyCPU projet.
J'ai trouvé ceci pour être le meilleur moyen de vérifier pour la plate-forme du système et le processus:
La première propriété renvoie la valeur true pour les systèmes 64 bits, et false pour les 32 bits.
La deuxième propriété renvoie la valeur vrai pour les processus 64 bits, et false pour les 32 bits.
La nécessité de ces deux propriétés est parce que vous pouvez exécuter les processus 32 bits sur un système 64 bits, de sorte que vous aurez besoin de vérifier à la fois le système et les processus.
Tous très bien, mais cela devrait également travailler à partir d'
env
:..
Trop facile, peut-être 😉
Voici un Windows Management Instrumentation (WMI) approche:
OSInfo.Bits
Inclure le code suivant dans une classe dans votre projet:
L'utiliser comme ceci:
L'utiliser pour obtenir l'installation de Windows architecture:
Étant donné que l'on a accepté la réponse est très complexe. Il y a des moyens plus simples. La mienne est une variation de alexandrudicu de anaswer.
Étant donné que la version 64 bits de windows installer des applications 32 bits dans Program Files (x86) vous pouvez vérifier si ce dossier existe, à l'aide de variables d'environnement (pour faire de la place pour les différentes localisations)
par exemple
Ce qui pour moi est plus rapide et plus simple. Étant donné que je tiens aussi à accéder à un chemin spécifique en vertu de ce dossier basé sur la version de l'OS.
Vient de voir si l' "C:\Program Files (x86)" existe. Si pas, alors vous êtes sur un OS 32 bits. Si c'est le cas, l'OS est en 64 bits (Windows Vista ou Windows 7). Il semble assez simple...
Profiter 😉
J'utilise:
Il obtient le chemin d'accès où votre application est lancée dans le cas où vous l'avez installé dans divers endroits sur l'ordinateur. Aussi, vous pourriez faire le grand
C:\
chemin, puisque 99,9% des ordinateurs ont installé Windows dansC:\
.J'utilise une version de la suite: