Desejo determinar se um assembly nativo é cumprido como x64 ou x86 em um aplicativo de código gerenciado ( C # ).
Acho que deve estar em algum lugar no cabeçalho do PE, já que o carregador do SO precisa conhecer essas informações, mas não consegui encontrá-las. É claro que prefiro fazê-lo em código gerenciado, mas, se necessário, posso usar C ++ nativo.
Respostas:
Você também pode usar DUMPBIN . Use o sinalizador
/headers
ou/all
e é o primeiro cabeçalho do arquivo listado.64 bits
32 bits
'find' pode tornar a vida um pouco mais fácil:
fonte
mspdb100.dll
:(mspdb100.dll
para a pasta ondedumpbin.exe
está localizado.DUMPBIN
pode correr depois disso. Para mim, o EXE está em<Visual Studio Install folder>\VC\bin
e a DLL está em<Visual Studio Install folder>\Common7\IDE
.Existe uma maneira fácil de fazer isso com o CorFlags . Abra o prompt de comando do Visual Studio e digite "corflags [your assembly]". Você obterá algo como isto:
Você está olhando especificamente para PE e 32BIT.
Qualquer CPU :
PE:
PE32 32BIT: 0
x86 :
PE:
PE32 32BIT: 1
x64:
PE:
PE32 + 32BIT: 0
fonte
Esse truque funciona e requer apenas o bloco de notas.
Abra o arquivo DLL usando um editor de texto (como o Bloco de notas) e encontre a primeira ocorrência da string
PE
. O caractere a seguir define se a dll é 32 ou 64 bits.32 bits:
64 bits:
fonte
O
Magic
campo doIMAGE_OPTIONAL_HEADER
(embora não haja nada opcional sobre o cabeçalho nas imagens executáveis do Windows (arquivos DLL / EXE)) mostrará a arquitetura do PE.Aqui está um exemplo de como pegar a arquitetura de um arquivo.
As únicas duas constantes de arquitetura no momento são:
Felicidades
ATUALIZAÇÃO Já faz um tempo desde que publiquei esta resposta, mas ainda vejo que há alguns upvotes de vez em quando, então achei que valia a pena atualizar. Eu escrevi uma maneira de obter a arquitetura de uma
Portable Executable
imagem, que também verifica se foi compilada comoAnyCPU
. Infelizmente, a resposta está em C ++, mas não deve ser muito difícil portar para C # se você tiver alguns minutos para pesquisar as estruturasWinNT.h
. Se as pessoas estiverem interessadas, escreverei uma porta em C #, mas, a menos que as pessoas realmente a desejem, não gastarei muito tempo enfatizando isso.A função aceita um ponteiro para uma imagem de PE na memória (para que você possa escolher como obtê-la; mapear a memória ou ler tudo na memória ... o que for).
fonte
32BIT
bandeira no PE, não sei de nada.Para um arquivo DLL não gerenciado, é necessário primeiro verificar se é um arquivo DLL de 16 bits (espero que não). Depois verifique o
IMAGE\_FILE_HEADER.Machine
campo.Alguém já teve tempo para resolver isso, então vou repetir aqui:
fonte
Você pode encontrar uma implementação de exemplo de C # aqui para a
IMAGE_FILE_HEADER
soluçãofonte
Os binários de 64 bits são armazenados no formato PE32 +. Tente ler http://www.masm32.com/board/index.php?action=dlattach;topic=6687.0;id=3486
fonte
Abra a dll com um editor hexadecimal, como HxD
Se houver um "dt" na 9ª linha, é de 64 bits.
Se houver um "L." na 9ª linha, é de 32 bits.
fonte
Reescrevi a solução c ++ na primeira resposta no script powershell. O script pode determinar esses tipos de arquivos .exe e .dll:
Essa solução tem algumas vantagens sobre o corflags.exe e o carregamento do assembly via Assembly.Load em C # - você nunca receberá BadImageFormatException ou mensagem sobre cabeçalho inválido.
exemplo de uso:
você pode omitir o segundo parâmetro se não precisar ver detalhes
fonte
Uma maneira rápida e provavelmente suja de fazer isso é descrita aqui: https://superuser.com/a/889267 . Você abre a DLL em um editor e verifica os primeiros caracteres após a sequência "PE".
fonte
Aparentemente, você pode encontrá-lo no cabeçalho do executável portátil. O utilitário corflags.exe pode mostrar se é ou não direcionado para x64. Espero que isso ajude você a encontrar mais informações sobre isso.
fonte
>corflags libzmq.dll \n\n ... corflags : error CF008 : The specified file does not have a valid managed header