none
Comment savoir si l'OS utilisateur est en 64 ou 32 bits ? RRS feed

  • Question

  • J'ai utilisé la commande IntPtr.Size qui affiche 4 sous windows 32 bits & 8 sous windows 64 bits. En VB.Net (Visual Studio 2008), une fois mon application compilée (en 32 bits biensûr). Cette commande n'est plus fiable (elle affiche un système en 32 bits même sur un 64 bits). Comment trouver la version de l'OS avec un framework 3.5 ?

    mardi 11 octobre 2011 08:16

Réponses

  • Bonjour,

    Si votre application est compilé en 32 il sera forcement en 32 sur un système 64.
    un programme fait en 64 ne sera pas compatible sur un système (x86) 32

    J'ai fait le test avec IntPtr.size en utilisant une compilation x64 j'ai une valeur de 8 et en 32 une valeur de 4 sur un système 64 (Windows 7)

    J'ai aussi fait le test avec un Windows XP version 32 avec un programme 64 et j'ai bien une erreur
    "N'est pas une application Win32 valide"

    Si vous voulez savoir a partir d'une application 32 l'architecture OS il faudra lire la variable d'environnement
    Exemple :
    Pour un systeme 32 --> PROCESSOR_ARCHITECTURE=x86
    Pour un systeme 64 --> PROCESSOR_ARCHITECTURE=AMD64


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    • Modifié TroxsaEditor mardi 11 octobre 2011 08:57
    • Proposé comme réponse TroxsaEditor mardi 11 octobre 2011 14:28
    • Marqué comme réponse TroxsaEditor jeudi 13 octobre 2011 11:51
    mardi 11 octobre 2011 08:57
    Auteur de réponse
  • Comolet,

    Une réponse vous a étés faite plus haut en donnant une autre solution que d'utiliser Environment.Is64BitOperationSystem cela ne vous conviens pas ?

    Voici une autre solution si les solutions données ne vous conviendrais pas

    Imports System.IO
    Imports System.Management
    
    
    
    Public Class Form1
    
        Function Is64BitOperatingSystem() As Boolean
            Try
                Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_OperatingSystem")
    
                For Each queryObj As ManagementObject In searcher.Get()
                    Return queryObj("OSArchitecture").ToString.Contains("64")
                Next
            Catch err As ManagementException
                MessageBox.Show(err.Message)
            End Try
            Return False
        End Function
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            MsgBox(Is64BitOperatingSystem)
            Me.Close()
        End Sub
    End Class
    

    A bientôt

     

     

     

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    • Proposé comme réponse TroxsaEditor jeudi 13 octobre 2011 08:53
    • Marqué comme réponse comolet jeudi 13 octobre 2011 11:49
    jeudi 13 octobre 2011 08:53
    Auteur de réponse
  • Comolet,

    Il faut aller dans Projet/Ajouté une référence et rechercher :

     System.Management.dll

    Cela fonctionne très bien avec une version Visual Studio 2005/2008 (Framework 2, 3, et 3.5)


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    • Marqué comme réponse comolet jeudi 13 octobre 2011 11:50
    jeudi 13 octobre 2011 11:23
    Auteur de réponse
  • C'est bon, merci !

    Je confirme que tout fonctionne bien sous le framework 3.5 après avoir ajouter en référence System.Management.dll

    Imports System.IO
    Imports System.Management



    Public Class Form1

        Function Is64BitOperatingSystem() As Boolean
            Try
                Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_OperatingSystem")

                For Each queryObj As ManagementObject In searcher.Get()
                    Return queryObj("OSArchitecture").ToString.Contains("64")
                Next
            Catch err As ManagementException
                MessageBox.Show(err.Message)
            End Try
            Return False
        End Function
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            MsgBox(Is64BitOperatingSystem)
            Me.Close()
        End Sub
    End Class

    Vous m'avez été d'une aide extrêmement précieuse.

    Merci et bonne continuation !

    Cordialement.

     

     

    • Marqué comme réponse comolet jeudi 13 octobre 2011 11:49
    jeudi 13 octobre 2011 11:49

Toutes les réponses

  • Bonjour,

    Si votre application est compilé en 32 il sera forcement en 32 sur un système 64.
    un programme fait en 64 ne sera pas compatible sur un système (x86) 32

    J'ai fait le test avec IntPtr.size en utilisant une compilation x64 j'ai une valeur de 8 et en 32 une valeur de 4 sur un système 64 (Windows 7)

    J'ai aussi fait le test avec un Windows XP version 32 avec un programme 64 et j'ai bien une erreur
    "N'est pas une application Win32 valide"

    Si vous voulez savoir a partir d'une application 32 l'architecture OS il faudra lire la variable d'environnement
    Exemple :
    Pour un systeme 32 --> PROCESSOR_ARCHITECTURE=x86
    Pour un systeme 64 --> PROCESSOR_ARCHITECTURE=AMD64


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn

    • Modifié TroxsaEditor mardi 11 octobre 2011 08:57
    • Proposé comme réponse TroxsaEditor mardi 11 octobre 2011 14:28
    • Marqué comme réponse TroxsaEditor jeudi 13 octobre 2011 11:51
    mardi 11 octobre 2011 08:57
    Auteur de réponse
  • j'ai  essayé d'utiliser PROCESSOR_ARCHITECTURE mais je ne suis pas arrivé à le mettre en place.

    Faut-il faire un import dans mon code VB.Net ?

    Est-il compatible avec mon framework 3.5 ?

    Cordialement.

    mardi 11 octobre 2011 11:46
  • Bonjour,

    Vous avez essayé de lire cette variable d'environnement avec http://msdn.microsoft.com/en-us/library/system.environment.getenvironmentvariable(v=VS.90).aspx ?

    Pour mémoire, lorsque vous passerez à la version 4 des propriétés permettant de savoir si l'os ou le process est en 64 bits ont été ajoutées sur System.Environment.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse TroxsaEditor mardi 11 octobre 2011 14:28
    • Non marqué comme réponse TroxsaEditor mardi 11 octobre 2011 14:28
    • Proposé comme réponse TroxsaEditor mardi 11 octobre 2011 14:28
    mardi 11 octobre 2011 11:54
    Modérateur
  • Bonjour,

    Regarde System.Environment.Is64BitOperatingSystem

    Aussi System.Environment.Is64BitProcess

    Tien je connaissais pas :)

    Pour resumer la chose

            Console.WriteLine(System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"))
            Console.WriteLine(System.Environment.Is64BitOperatingSystem)
            Console.WriteLine(System.Environment.Is64BitProcess)
    

    Résultat sous un système 64

    1. AMD64
    2. True
    3. True

    Résultat sous un système 32

    1. x86
    2. False
    3. False

     

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    • Proposé comme réponse TroxsaEditor mardi 11 octobre 2011 14:28
    mardi 11 octobre 2011 14:26
    Auteur de réponse
  • Bonjour,

    Dans le .NET Framework 3.5 les propriétés Is64XXXX n'existe pas. Vous devez donc récupérer les variable d'environnement "PROCESSOR_ARCHITECTURE" comme l'a très bien démontré Xavier.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    mardi 11 octobre 2011 22:17
    Modérateur
  • Bonjour, Comolet,

     

    Est-ce que vous avez résolu votre problème ? Merci de tenir la communauté informée sur la suite de vos démarches.

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 13 octobre 2011 06:25
  • Après vérification et de recherche, il s'avère que System.Environment.Is64BitOperatingSystem ainsi que  System.Environment.Is64BitProcess corresponde à un Framework 4.

    Je suis apparemment coincé car je travaille qu'en FrameWork 3.5 (visual studio 2008).

    Sinon effectivement, ce système doit très bien fonctionné.

    Cordialement.

    jeudi 13 octobre 2011 08:26
  • Comolet,

    Une réponse vous a étés faite plus haut en donnant une autre solution que d'utiliser Environment.Is64BitOperationSystem cela ne vous conviens pas ?

    Voici une autre solution si les solutions données ne vous conviendrais pas

    Imports System.IO
    Imports System.Management
    
    
    
    Public Class Form1
    
        Function Is64BitOperatingSystem() As Boolean
            Try
                Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_OperatingSystem")
    
                For Each queryObj As ManagementObject In searcher.Get()
                    Return queryObj("OSArchitecture").ToString.Contains("64")
                Next
            Catch err As ManagementException
                MessageBox.Show(err.Message)
            End Try
            Return False
        End Function
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            MsgBox(Is64BitOperatingSystem)
            Me.Close()
        End Sub
    End Class
    

    A bientôt

     

     

     

     


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    • Proposé comme réponse TroxsaEditor jeudi 13 octobre 2011 08:53
    • Marqué comme réponse comolet jeudi 13 octobre 2011 11:49
    jeudi 13 octobre 2011 08:53
    Auteur de réponse
  • Xavier Talour,

    je n'ai pas oublié votre code, je suis actuellement en train de travailler dessus. Car malgré l'import System.Management,

    celui-ci me pose des problèmes "ManagementObjectSearcher est non défini" et solutions proposés par VS 2008 "aucune solutions".

    J'ai la même choses avec "ManagementObject". Quant à "ManagementException" ce n'est pas mieux. Aussi je consulte en ce moment la librairie pour essayer de comprendre.Car System.Management existe dans tous les frameworks. J'essaye de voir au niveau de mon framework 3.5.Aussi, veuillez m'excuser si j'ai tardé à vous répondre.Cordialement.

    jeudi 13 octobre 2011 10:03
  • Comolet,

    Il faut aller dans Projet/Ajouté une référence et rechercher :

     System.Management.dll

    Cela fonctionne très bien avec une version Visual Studio 2005/2008 (Framework 2, 3, et 3.5)


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    • Marqué comme réponse comolet jeudi 13 octobre 2011 11:50
    jeudi 13 octobre 2011 11:23
    Auteur de réponse
  • C'est bon, merci !

    Je confirme que tout fonctionne bien sous le framework 3.5 après avoir ajouter en référence System.Management.dll

    Imports System.IO
    Imports System.Management



    Public Class Form1

        Function Is64BitOperatingSystem() As Boolean
            Try
                Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_OperatingSystem")

                For Each queryObj As ManagementObject In searcher.Get()
                    Return queryObj("OSArchitecture").ToString.Contains("64")
                Next
            Catch err As ManagementException
                MessageBox.Show(err.Message)
            End Try
            Return False
        End Function
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            MsgBox(Is64BitOperatingSystem)
            Me.Close()
        End Sub
    End Class

    Vous m'avez été d'une aide extrêmement précieuse.

    Merci et bonne continuation !

    Cordialement.

     

     

    • Marqué comme réponse comolet jeudi 13 octobre 2011 11:49
    jeudi 13 octobre 2011 11:49