Comment détecter Windows plate-forme 64 bits .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.
OriginalL'auteur Marc | 2008-12-03
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:
IsWow64Process a été introduit avec Win XP SP2. Ce code fonctionne très bien si vous avez besoin d'XP SP2 ou une version plus récente.
vous pouvez simplement utiliser DoesWin32MethodExist avant d'appeler IsWow64Process, qui est ce que l' .net 4.0 mise en œuvre de is64BitOperatingSystem.
Votre solution renvoie la valeur correcte sur un MacBook Pro avec processeur Intel core i7-3720QM microprocesseur exécutant Bootcamp à l'aide d'un Widows 7 Ultime partition. +1
Pour info: à partir .Net 4.0, vous pouvez simplement vérifier
System.Environment.Is64BitOperatingSystem
. Vous pouvez modifier cela dans votre réponse, ou de me donner la permission de monter dans votre réponse?OriginalL'auteur Stefan Schultze
.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.
referencesource.microsoft.com
Selon la source de référence, il fait quelque chose comme ceci:
if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());
(pseudo-code)Nice. Si l'utilisateur .NET 4.0 c'est certainement la bonne réponse (c'est à dire de l'Environnement.Is64BitOperatingSystem). -- Pour info la propriété ne semble pas être là .NET 3.5.
Cela ne répond pas à la question qui a expressément dit .Net 2.0
OriginalL'auteur Phil Devaney
Si vous utilisez .NET Framework 4.0, c'est facile:
Voir De l'environnement.Is64BitOperatingSystem Propriété (MSDN).
Pour les geek, la mise en œuvre interne à l'aide de IsWow64Process(...) referencesource.microsoft.com/#mscorlib/system/...
OriginalL'auteur Peter Vaughan-Williams
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!)
OriginalL'auteur dwhiteho
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.
fait (ou a fait) ceux qui sont encore la cible de ces antiques systèmes?
Bon sang, où est la "bonne" réponse?
Cet exemple ne parvient pas à éliminer le Processus de l'instance retournée par Processus.Fonction getcurrentprocess().
OriginalL'auteur Bruno Lopes
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).
Notez que ce code est sous licence Microsoft Public License.
WMI version sans géré .net? Je voudrais voir que, n'ont pas trouvé jusqu'à présent
Cette réponse devrait être le premier...!
OriginalL'auteur synhershko
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.
Ce rapport de l'architecture du processeur de Windows; pas le CPU. Voir l'explication détaillée de départ au "Code" sur cette page: andrewensley.com/2009/06/c-detect-windows-os-part-1
Juste pour ajouter 2 cents, lorsque vous exécutez cette, et votre application est configuré pour
prefer 32-bit
avecAny CPU
que votrePlatform Target
alors vous obtiendrezx86
, mais si vous décochezPrefer 32-bit
il vous sera alorsAMD64
.OriginalL'auteur Andrew Ensley
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
OriginalL'auteur electricalbah
Essayez ceci:
Merci, cette réponse était très simple, et il m'a fait ce dont j'avais besoin. Je peux voir que vous avez été voté en bas et j'ai voté, vous, parce que votre réponse a été la plus utile pour moi ici.
il a été downvoted cause de son une bonne réponse, mais pour un diff. question 🙂
OriginalL'auteur user2235582
@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, la 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.
stefan Schultze 1 : sysadmin 0 😉
Nope. retourné "x86" sur mon windows 7 pro 64 bits du Système d'Exploitation.
OriginalL'auteur SomeSysadmin
Façon la plus rapide:
Remarque: c'est très direct.
Cela ne fonctionne pas - si vous êtes en 32 bits .NET Framework 2.0 sur Windows 64 bits, il sera de retour en version 32 bits.
Droit j'ai oublié cette situation. J'ai édité la question de la mentionner. Merci stefan-mg.
Ce n'est pas correct; la plate-forme peut être de 64 bits mais vous êtes toujours en cours d'exécution en mode 32 bits.
Si ce n'est pas correct, supprimez la mauvaise réponse peut-être
OriginalL'auteur BobbyShaftoe
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.
Ce code fonctionne sur .NET (testé sur la version 2.0). Des variables d'environnement peuvent être consultées par: l'Environnement.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); l'Environnement.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432");
OriginalL'auteur Santhosh
À l'aide de dotPeek aide à voir la façon dont le cadre ne fait. Avec cela à l'esprit, voici ce que j'ai trouvé:
Exemple d'utilisation:
OriginalL'auteur Alexandru
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:
OriginalL'auteur Julian Hall
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:
OriginalL'auteur
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.Quelles sont les chances qu'un utilisateur va créer un dossier sur le but? C'est juste une autre façon de vérifier si le système d'exploitation x64.
Quelles sont les chances que votre ordinateur a un virus? Depuis que les chances sont très faibles, mieux vaut ne pas installer aucune protection alors... la Programmation n'est pas sur la création de quelque chose qui a peu de chances de sciemment défaut. Il s'agit de créer quelque chose qui a peu de chances de sans le savoir échec, puis le fixer. La première est appelée la mauvaise programmation/mauvaise mise en œuvre, le second est appelé un bug.
OriginalL'auteur Alexandru Dicu
Ici est l'approche directe en C# à l'aide de DllImport de cette page.
Aussi se bloque sur un ancien OS, depuis
IsWow64Process
n'existe pas.OriginalL'auteur ripper234
Je suis en utilisant le followin code. Remarque: Il est fait pour un AnyCPU projet.
OriginalL'auteur blez
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.
OriginalL'auteur OmarElsherif
Tous très bien, mais cela devrait également travailler à partir d'
env
:..
Trop facile, peut-être 😉
OriginalL'auteur
Voici un Windows Management Instrumentation (WMI) approche:
OriginalL'auteur user1054695
OSInfo.Bits
"C:\Program Files\Microsoft.NET\SDK\v2.0 64bit\LateBreaking\PlatformInvoke\WinAPIs\OSInfo\CS\OSInfoCS.la sln"
OriginalL'auteur Greg
Inclure le code suivant dans une classe dans votre projet:
L'utiliser comme ceci:
OriginalL'auteur Knickerless-Noggins
L'utiliser pour obtenir l'installation de Windows architecture:
OriginalL'auteur user885959
É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.
Oui, le mien est pour .net 2.0.
OriginalL'auteur John Demetriou
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...
Je dirais que c'est une bonne idée, mais vous ne pouvez pas assumer un utilisateur de ne plus jamais le faire pour une raison obscure.
Certaines applications mal écrites sont en train d'installer directement à "Program Files (x86)", sans égard à l'architecture. J'ai le répertoire sur mon ordinateur 32 bits grâce à SOAPSonar, par exemple.
OriginalL'auteur John
Profiter 😉
OriginalL'auteur Majid95
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:\
.Je ne le recommande pas, mais vous pourriez obtenir environ la localisation de la question, en élargissant l'environnement var %ProgramFiles(x86)%
OriginalL'auteur Ben G
J'utilise une version de la suite:
Mais même les systèmes 64 bits ce dossier haha
OriginalL'auteur Josh