IntPtr.Size não retornará o valor correto se estiver executando no .NET Framework 2.0 de 32 bits no Windows de 64 bits (retornaria 32 bits).
Como descreve Raymond Chen, da Microsoft, você deve primeiro verificar se está executando um processo de 64 bits (acho que no .NET você pode fazer isso verificando IntPtr.Size) e, se estiver executando um processo de 32 bits, ainda assim precisa chamar a função API do Windows, IsWow64Process. Se isso retornar verdadeiro, você estará executando um processo de 32 bits no Windows de 64 bits.
Raymond Chen, da Microsoft:
Como detectar programaticamente se você está executando no Windows de 64 bits
Minha solução:
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
. Você pode editar isso em sua resposta ou me dar permissão para editá-lo em sua resposta?O .NET 4 possui duas novas propriedades na classe Environment, Is64BitProcess e Is64BitOperatingSystem . Curiosamente, se você usa o Reflector, pode ver que eles são implementados de maneira diferente nas versões de 32 e 64 bits do mscorlib. A versão de 32 bits retorna false para Is64BitProcess e chama IsWow64Process via P / Invoke para Is64BitOperatingSystem. A versão de 64 bits apenas retorna true para ambos.
fonte
if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());
(pseudo-código)Is64BitProcess
eIs64BitOperatingSystem
(links para a versão 2.0).Se você estiver usando o .NET Framework 4.0, é fácil:
Consulte a propriedade Environment.Is64BitOperatingSystem (MSDN).
fonte
Esta é apenas uma implementação do que é sugerido acima por Bruno Lopez, mas funciona no Win2k + todos os service packs do WinXP. Só pensei em postá-lo para que outras pessoas não o rolassem manualmente. (teria postado como um comentário, mas sou um novo usuário!)
fonte
A resposta completa é esta (retirada das respostas de stefan-mg, ripper234 e BobbyShaftoe):
Primeiro verifique se você está em um processo de 64 bits. Caso contrário, verifique se o processo de 32 bits é um Wow64Process.
fonte
A Microsoft colocou um exemplo de código para isso:
http://1code.codeplex.com/SourceControl/changeset/view/39074#842775
Se parece com isso:
Também existe uma versão WMI (para testar máquinas remotas).
fonte
Você também pode verificar a
PROCESSOR_ARCHITECTURE
variável de ambiente.Ele não existe ou está definido como "x86" no Windows de 32 bits.
fonte
prefer 32-bit
comAny CPU
o seuPlatform Target
, você receberáx86
, mas se você desmarcáPrefer 32-bit
-lo, receberáAMD64
.Do blog de Chriz Yuen
C # .Net 4.0 Introduziu duas novas propriedades de ambiente Environment.Is64BitOperatingSystem; Environment.Is64BitProcess;
Tenha cuidado ao usar essas duas propriedades. Teste na máquina Windows 7 64bits
fonte
Maneira mais rápida:
Nota: isso é muito direto e funciona corretamente em 64 bits apenas se o programa não forçar a execução como um processo de 32 bits (por exemplo,
<Prefer32Bit>true</Prefer32Bit>
nas configurações do projeto).fonte
Tente o seguinte:
fonte
@foobar: Você está certo, é muito fácil;)
Em 99% dos casos, os desenvolvedores com histórico de administrador de sistema fraco acabam não percebendo o poder que a Microsoft sempre forneceu para qualquer pessoa enumerar o Windows.
Os administradores de sistema sempre escrevem códigos melhores e mais simples quando se trata de tal ponto.
No entanto, uma coisa a ser observada, a configuração da compilação deve ser AnyCPU para essa variável de ambiente para retornar os valores corretos nos sistemas corretos:
Isso retornará "X86" no Windows de 32 bits e "AMD64" no Windows de 64 bits.
fonte
O uso do dotPeek ajuda a ver como a estrutura realmente faz isso. Com isso em mente, aqui está o que eu criei:
Exemplo de uso:
fonte
Use estas duas variáveis de ambiente (pseudo-código):
Consulte a publicação no blog HOWTO: Detectar Process Bitness .
fonte
Eu usei essa verificação com êxito em muitos sistemas operacionais:
Essa pasta sempre é chamada "SysWOW64", independentemente do idioma do sistema operacional. Isso funciona para o .NET Framework 1.1 ou superior.
fonte
SysWOW64
em um%windir%
sistema operacional de 32 bits? A presença de uma pasta significa exatamente isso: que a pasta está presente.Preciso fazer isso, mas também preciso ser administrador, remotamente, caso isso pareça funcionar muito bem para mim:
fonte
Esta é uma solução baseada no código da Microsoft em http://1code.codeplex.com/SourceControl/changeset/view/39074#842775 . Ele usa métodos de extensão para facilitar a reutilização de código.
Alguns usos possíveis são mostrados abaixo:
fonte
Aqui está a abordagem direta em C # usando DllImport nesta página .
fonte
IsWow64Process
não existe.Estou usando o código a seguir. Nota: Foi feito para um projeto AnyCPU.
fonte
Eu achei que essa era a melhor maneira de verificar a plataforma do sistema e o processo:
A primeira propriedade retorna true para o sistema de 64 bits e false para 32 bits. A segunda propriedade retorna true para o processo de 64 bits e false para 32 bits.
A necessidade dessas duas propriedades é porque você pode executar processos de 32 bits no sistema de 64 bits, portanto, será necessário verificar o sistema e o processo.
fonte
Tudo bem, mas isso também deve funcionar em
env
:..
Muito fácil, talvez ;-)
fonte
Aqui está uma abordagem da WMI ( Instrumentação de Gerenciamento do Windows ):
fonte
OSInfo.Bits
fonte
Inclua o seguinte código em uma classe em seu projeto:
Use-o assim:
fonte
Use isto para obter a arquitetura instalada do Windows:
fonte
Dado que a resposta aceita é muito complexa. Existem maneiras mais simples. O meu é uma variação do respondente de alexandrudicu. Como as janelas de 64 bits instalam aplicativos de 32 bits nos Arquivos de Programas (x86), é possível verificar se essa pasta existe, usando variáveis de ambiente (para compensar diferentes localizações)
por exemplo
Isso para mim é mais rápido e mais simples. Como também desejo acessar um caminho específico nessa pasta com base na versão do sistema operacional.
fonte
Aproveitar ;-)
fonte
Veja se o "C: \ Arquivos de Programas (x86)" existe. Caso contrário, você estará em um sistema operacional de 32 bits. Nesse caso, o sistema operacional é de 64 bits (Windows Vista ou Windows 7). Parece bastante simples ...
fonte
Eu uso:
Isso mostra o caminho em que seu aplicativo é iniciado, caso você o tenha instalado em vários locais do computador. Além disso, você pode fazer o
C:\
caminho geral, já que 99,9% dos computadores por aí têm o Windows instaladoC:\
.fonte
Eu uso uma versão do seguinte:
fonte