2010-08-14 8 views
4

En C#, comment puis-je savoir par programme si le système d'exploitation est x64 ou x86En C#, comment puis-je savoir par programme si le système d'exploitation est x64 ou x86

J'ai trouvé cette méthode API sur Internet, mais il ne fonctionne pas

[DllImport("kernel32.dll")] 
public static extern bool IsWow64Process(System.IntPtr hProcess, out bool lpSystemInfo); 

public static bool IsWow64Process1 
{ 
    get 
    { 
     bool retVal = false; 
     IsWow64Process(System.Diagnostics.Process.GetCurrentProcess().Handle, out retVal); 
     return retVal; 
    } 
} 

Merci d'avance.

+0

Quelle est l'erreur qu'il renvoie? pourriez-vous publier la valeur de retour de l'API IsWow64Process? En outre, votre DLL .NET est-elle compilée en tant que AnyCPU? – obelix

+1

également, essayez une recherche - bing renvoie http://stackoverflow.com/questions/336633/how-to-detect-windows-64-bit-platform-with-net en conséquence. – obelix

+0

@obelix: Il n'y a pas d'erreur, mais ma version du système d'exploitation est 64 et elle renvoie false – Homam

Répondre

8

Dans .NET 4.0, vous pouvez utiliser la nouvelle propriété Environment.Is64BitOperatingSystem.

Et voilà comment il est impemented

public static bool Is64BitOperatingSystem 
{ 
    [SecuritySafeCritical] 
    get 
    { 
     bool flag; 
     return ((Win32Native.DoesWin32MethodExist("kernel32.dll", "IsWow64Process") && Win32Native.IsWow64Process(Win32Native.GetCurrentProcess(), out flag)) && flag); 
    } 
} 

réflecteur utilisation ou similaire pour voir exactement comment cela fonctionne.

+1

Ouais, ils ont tout gâché. –

2

bool x86 = IntPtr.Size == 4;

+5

cela peut ne pas être correct - http://stackoverflow.com/questions/336633/how-to-detect-windows-64- bit-platform-with-net – obelix

+0

J'ai .Net 3.5, ça a l'air de bien fonctionner, qu'en penses-tu? – Homam

+2

Cela vous montrera si vous exécutez sur 32 bits ** ou ** vous exécutez sous WOW64 sur 64 bits. Il ne vous donnera pas la * plate-forme * réelle, mais vous dira l'environnement d'exécution actuel. –

1

Si vous construisez contre AnyCPU, et que vous exécutez sur un Système 64 bits, il fonctionnera sur la version 64 bits du framework. Sur un système 32 bits, il fonctionnera sur la version 32 bits du framework. Vous pouvez l'utiliser à son avantage en vérifiant simplement la propriété IntPtr.Size. Si le Size = 4, vous exécutez sur 32 bits, Size = 8, vous exécutez sur 64 bits.

+0

Cela a été plus compliqué avec .NET 4.5. La valeur par défaut est maintenant "Any CPU (32-bit preferred)". Voir http://blogs.microsoft.co.il/blogs/sasha/archive/2012/04/04/what-anycpu-really-means-as-of-net-4-5-and-visual-studio-11 .aspx –

0

Ce qui suit est de this answer, alors ne me upvote pour elle :)

if (8 == IntPtr.Size 
    || (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432")))) 
{ 
    // x64 
} 
else 
{ 
    // x86 
}