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, todavía tiene que llamar a la función Win API IsWow64Process. Si esto devuelve verdadero, está ejecutando un proceso de 32 bits en Windows de 64 bits.
Raymond Chen de Microsoft:
cómo detectar mediante programación si se está ejecutando en 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;
}
}
System.Environment.Is64BitOperatingSystem
. ¿Puedes editar esto en tu respuesta o darme permiso para editarlo en tu respuesta?.NET 4 tiene dos nuevas propiedades en la clase de entorno, Is64BitProcess e Is64BitOperatingSystem . Curiosamente, si usa Reflector, puede ver que se implementan de manera diferente en las versiones de mscorlib de 32 y 64 bits. La versión de 32 bits devuelve falso para Is64BitProcess y llama a IsWow64Process a través de P / Invoke para Is64BitOperatingSystem. La versión de 64 bits solo devuelve verdadero para ambos.
fuente
if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());
(pseudocódigo)Is64BitProcess
yIs64BitOperatingSystem
(enlaces para la versión 2.0).Si está utilizando .NET Framework 4.0, es fácil:
Consulte Environment.Is64BitOperatingSystem Property (MSDN).
fuente
Esto es solo una implementación de lo sugerido anteriormente por Bruno López, pero funciona en Win2k + todos los paquetes de servicio de WinXP. Solo pensé que lo publicaría para que otras personas no lo hubieran rodado a mano. (habría publicado como comentario, ¡pero soy un nuevo usuario!)
fuente
La respuesta completa es la siguiente (tomada de stefan-mg, ripper234 y la respuesta de BobbyShaftoe):
Primero verifique si está en un proceso de 64 bits. Si no lo está, verifique si el proceso de 32 bits es un Wow64Process.
fuente
Microsoft ha puesto un código de muestra para esto:
http://1code.codeplex.com/SourceControl/changeset/view/39074#842775
Se parece a esto:
También hay una versión WMI disponible (para probar máquinas remotas).
fuente
También puede verificar la
PROCESSOR_ARCHITECTURE
variable de entorno.No existe o está configurado en "x86" en Windows de 32 bits.
fuente
prefer 32-bit
conAny CPU
como suPlatform Target
por lo que recibiráx86
, pero si no marcasPrefer 32-bit
que a continuación, recibiráAMD64
.Del blog de Chriz Yuen
C # .Net 4.0 introdujo dos nuevas propiedades de entorno Environment.Is64BitOperatingSystem; Environment.Is64BitProcess;
Tenga cuidado cuando use estas dos propiedades. Prueba en Windows 7 64bits Machine
fuente
La manera mas rapida:
Nota: esto es muy directo y funciona correctamente en 64 bits solo si el programa no fuerza la ejecución como un proceso de 32 bits (por ejemplo,
<Prefer32Bit>true</Prefer32Bit>
en la configuración del proyecto).fuente
Prueba esto:
fuente
@foobar: Tienes razón, es demasiado fácil;)
En el 99% de los casos, los desarrolladores con antecedentes débiles de administrador del sistema finalmente no se dan cuenta del poder que Microsoft siempre ha brindado a cualquiera para enumerar Windows.
Los administradores del sistema siempre escribirán un código mejor y más simple cuando se trata de tal punto.
Sin embargo, una cosa a tener en cuenta, la configuración de compilación debe ser AnyCPU para que esta variable de entorno devuelva los valores correctos en los sistemas correctos:
Esto devolverá "X86" en Windows de 32 bits y "AMD64" en Windows de 64 bits.
fuente
Usar dotPeek ayuda a ver cómo lo hace realmente el marco. Con eso en mente, esto es lo que se me ocurrió:
Ejemplo de uso:
fuente
Use estas dos variables de entorno (pseudocódigo):
Consulte la publicación del blog CÓMO: Detectar Bitness de proceso .
fuente
Utilicé esta comprobación con éxito en muchos sistemas operativos:
Esta carpeta siempre se llama "SysWOW64", sin importar el idioma del sistema operativo. Esto funciona para .NET Framework 1.1 o superior.
fuente
SysWOW64
en un%windir%
sistema operativo de 32 bits? La presencia de una carpeta significa exactamente eso: que la carpeta está presente.Necesito hacer esto, pero también necesito poder como administrador hacerlo de forma remota, en cualquier caso, esto parece funcionar bastante bien para mí:
fuente
Esta es una solución basada en el código de Microsoft en http://1code.codeplex.com/SourceControl/changeset/view/39074#842775 . Utiliza métodos de extensión para reutilizar fácilmente el código.
Algunos usos posibles se muestran a continuación:
fuente
Aquí está el enfoque directo en C # usando DllImport de esta página .
fuente
IsWow64Process
que no existe.Estoy usando el siguiente código. Nota: Está hecho para un proyecto AnyCPU.
fuente
Encontré que esta es la mejor manera de verificar la plataforma del sistema y el proceso:
La primera propiedad devuelve verdadero para el sistema de 64 bits y falso para el de 32 bits. La segunda propiedad devuelve verdadero para el proceso de 64 bits y falso para el de 32 bits.
La necesidad de estas dos propiedades se debe a que puede ejecutar procesos de 32 bits en un sistema de 64 bits, por lo que deberá verificar tanto el sistema como el proceso.
fuente
Todo bien, pero esto también debería funcionar desde
env
:..
Demasiado fácil, tal vez ;-)
fuente
Aquí está un enfoque de Instrumental de administración de Windows (WMI):
fuente
OSInfo.Bits
fuente
Incluya el siguiente código en una clase en su proyecto:
Úselo así:
fuente
Use esto para obtener la arquitectura de Windows instalada:
fuente
Dado que la respuesta aceptada es muy compleja. Hay formas mas simples. El mío es una variación de la respuesta de alexandrudicu. Dado que las ventanas de 64 bits instalan aplicaciones de 32 bits en Archivos de programa (x86), puede verificar si esa carpeta existe, utilizando variables de entorno (para compensar las diferentes localizaciones)
p.ej
Esto para mí es más rápido y sencillo. Dado que también deseo acceder a una ruta específica en esa carpeta según la versión del sistema operativo.
fuente
Disfruta ;-)
fuente
Solo vea si existe el "C: \ Archivos de programa (x86)". Si no, entonces estás en un sistema operativo de 32 bits. Si lo hace, entonces el sistema operativo es de 64 bits (Windows Vista o Windows 7). Parece bastante simple ...
fuente
Yo suelo:
Esto obtiene la ruta donde se inicia su aplicación en caso de que la tenga instalada en varios lugares de la computadora. Además, podría hacer la
C:\
ruta general ya que el 99.9% de las computadoras tienen Windows instaladoC:\
.fuente
Yo uso una versión de lo siguiente:
fuente