¿Cómo detectar la plataforma Windows de 64 bits con .NET?
En una aplicación .NET 2.0 C# utilizo el siguiente código para detectar la plataforma del sistema operativo:
string os_platform = System.Environment.OSVersion.Platform.ToString();
Esto devuelve "Win32NT". El problema es que devuelve "Win32NT" incluso cuando se ejecuta en Windows Vista de 64 bits.
¿Existe algún otro método para conocer la plataforma correcta (32 o 64 bits)?
Tenga en cuenta que también debería detectar 64 bits cuando se ejecuta como una aplicación de 32 bits en Windows de 64 bits.
.NET 4 tiene dos nuevas propiedades en la clase Environment, Is64BitProcess e Is64BitOperatingSystem . Curiosamente, si usa Reflector, podrá ver que se implementan de manera diferente en las versiones de 32 y 64 bits de mscorlib. La versión de 32 bits devuelve false para Is64BitProcess y llama a IsWow64Process mediante P/Invoke para Is64BitOperatingSystem. La versión de 64 bits simplemente devuelve verdadero para ambos.
ACTUALIZACIÓN: Como sugieren Joel Coehoorn y otros, a partir de .NET Framework 4.0, puede simplemente verificar Environment.Is64BitOperatingSystem
.
IntPtr.Size no devolverá el valor correcto si se ejecuta en .NET Framework 2.0 de 32 bits en Windows de 64 bits (devolvería 32 bits).
Como describe Raymond Chen de Microsoft, primero debe verificar si se está ejecutando en un proceso de 64 bits (creo que en .NET puede hacerlo marcando IntPtr.Size), y si está ejecutando en un proceso de 32 bits, aún Tienes que llamar a la función Win API IsWow64Process. Si esto es verdadero, está ejecutando un proceso de 32 bits en Windows de 64 bits.
Raymond Chen de Microsoft: Cómo detectar mediante programación si está ejecutando Windows de 64 bits
Mi solución:
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;
}
}