Como verificar a dependência de DLL?

165

Às vezes, quando estou fazendo um pequeno projeto, não sou cuidadoso o suficiente e acidentalmente adiciono uma dependência para uma DLL que não conheço. Quando envio este programa para um amigo ou outras pessoas, "ele não funciona" porque "alguma DLL" está ausente. Isso ocorre porque o programa pode encontrar a DLL no meu sistema, mas não no deles.

Existe uma maneira de varrer um executável em busca de dependências de DLL ou executar o programa em um ambiente livre de DLL "limpo" para testar para evitar essas situações opcionais ?

orlp
fonte
2
O depurador mostra todas as DLLs carregadas na janela Saída. Os módulos Debug + Windows + mostram uma lista deles. Certifique-se de que você pode dar conta de todos eles. E teste seu instalador como você testa seu código, use uma VM.
Hans Passant
@ Hans Passant: Posso encontrar uma lista completa de DLLs padrão do Windows em algum lugar?
orlp 11/09/11
Sim, em c: \ windows \ system32 com direitos autorais da Microsoft.
Hans Passant
2
@orlp - Você também pode tentar dumpbin /dependents <program>. Acho que a lista será mais relevante do que listar todas as DLLs em %SYSTEM%ou %SYSTEM32%. Consulte também Opções de DUMPBIN no MSDN.
JWW

Respostas:

103

Try Dependency Walker(última atualização em 2006) ou uma reescrita moderna chamada Dependencies.

Luchian Grigore
fonte
20
Eu li que isso agora é datado, há algo mais atual?
TankorSmash
6
Se possível, confiarei apenas no provedor de SO original, pois a dependência de ddl deve ser uma tarefa do SO. Algum programa utilitário da Microsoft pode fazer isso? Linha de comando está bem para mim.
precisa saber é o seguinte
3
@RobinHsu: O DependencyWalker era enviado com o Visual Studio até o Visual Studio 2005. A versão mais recente está incluída no Windows Driver Development Kit (e não está disponível no site oficial). Ainda não é oficialmente uma ferramenta da Microsoft, mas é sancionada, promovida e anunciada pela Microsoft.
IInspectable
8
dumpbinsobre dependência walker. msdn.microsoft.com/en-us/library/756as972.aspx | stackoverflow.com/a/28304716/3543437
kayleeFrye_onDeck
8
Agora, há uma reescrita de código aberto feita parcialmente em C #, e conheça " Dependencies.exe ": github.com/lucasg/Dependencies . Impressão de teste: um pouco beta-ish , mas lida com conjuntos de API e SxS aparentemente (faltando no Dependency Walker).
Stein Åsmul
216

dumpbin das ferramentas do Visual Studio (pasta VC \ bin) podem ajudar aqui:

dumpbin /dependents your_dll_file.dll
JeffRSon
fonte
7
Pequena ferramenta prática e economiza a necessidade de instalar algo novo quando você já tem o VS instalado.
James
13
Sim, dumpbin.exeé muito útil descobrir /dependentse /imports. Você também pode usá-lo em outras máquinas se copiar link.exejunto e verificar se o x86 Visual C ++ Runtime Redistributable correspondente ( msvcr120.dllpara Visual Studio 2013) está disponível na máquina de destino. Algumas opções têm dependências adicionais. - A propósito, eles estragaram o nome da opção, deveria ter sido /PREREQUISITESe não /DEPENDENTS, deveriam ter estudado latim.
Lumi
2
É tão bom que adicionamos isso ao nosso sistema de compilação como uma etapa de verificação quando o executável final é gerado, para que não dependamos de algo que não esteja incluído no envio.
Lothar
4
A única desvantagem desta ferramenta prática é muito oculta: c: \ Arquivos de programas (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach
1
@rkachach Se você abrir a linha de comando do Visual Studio (Ferramentas -> Prompt de Comando do Visual Studio), isso será reconhecido como um comando externo e você só precisará digitar "dumpbin".
Bemipefe 23/10/19
45

Eu posso recomendar uma solução interessante para os fãs do Linux. Depois de explorar essa solução, mudei do DependencyWalker para isso.

Você pode usar seu favorito ldd sobre o Windows relacionados com exe, dll.

Para fazer isso, você precisa instalar o Cygwin (instalação básica, sem a necessidade de pacotes adicionais) no seu Windows e então apenas iniciarCygwin Terminal . Agora você pode executar seus comandos favoritos do Linux, incluindo:

$ ldd your_dll_file.dll

UPD: Você lddtambém pode usar o terminal git bash no Windows . Não é necessário instalar o cygwin, caso você já tenha o git instalado.

troyane
fonte
Acabei de instalar o cygwin e fiquei feliz em encontrar comandos back linux, mas não consegui sair da raiz do Cygwin para acessar outros arquivos na minha unidade local (C :). Isso é normal?
ThomasGuenet
1
Eu acho que isso poderia ajudá-lo: stackoverflow.com/questions/1850920/...
troyane
4
Infelizmente, existem algumas dependências que não são encontradas desta forma: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). O utilitário dumpbin mostra todas as dependências corretamente.
precisa saber é o seguinte
5
Eu uso o ldd através do terminal GIT BASH no Windows e funciona bem. Portanto, se você tiver o git, será fácil, não há necessidade de instalar o cygwin. Exemplo: borkox @ bobipc MINGW64 ~ $ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar/org/bytedeco/javacpp/windows-x86_64/jniopenblas_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => / c / WINDOWS / System32 / KERNELBASE. dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov
1
Como alguém que já tinha o git bash instalado, essa era uma solução preferível. Obrigado!
Nicolas #
28
  1. Descubra o caminho completo do arquivo para a montagem com a qual você está tentando trabalhar

  2. Pressione o botão Iniciar, digite "dev". Inicie o programa chamado "Prompt de Comando do Desenvolvedor para o VS 2017"

  3. Na janela que se abre, digite dumpbin /dependents [path]onde [path]está o caminho que você descobriu na etapa 1

  4. pressione a tecla Enter

Bam, você tem suas informações de dependência. A janela deve ficar assim:

insira a descrição da imagem aqui

Atualização para o VS 2019: você precisa deste pacote na instalação do VS:insira a descrição da imagem aqui

Iamsodarncool
fonte
9
  1. Existe um programa chamado "Depende"
  2. Se você tem o cygwin instalado, nada mais simples que o ldd file.exe
Artyom
fonte
4
A ferramenta é chamada Dependency Walker ; sua imagem executável é nomeada depends.exe .
IInspectable
7
O Walker de dependência está datado. Sua última construção é em 2008!
SuB
dependsnão suporta conjuntos de API, por isso é inútil para o Win7 +.
ivan_pozdeev 4/02/19
8

O mais seguro é ter uma máquina virtual limpa, na qual você possa testar seu programa. Em todas as versões que você deseja testar, restaure a VM ao seu valor inicial limpo. Em seguida, instale seu programa usando sua configuração e veja se ele funciona.

Problemas DLL têm faces diferentes. Se você usar o Visual Studio e vincular dinamicamente ao CRT, precisará distribuir as DLLs do CRT. Atualize seu VS e você precisará distribuir outra versão do CRT. Apenas verificar dependências não é suficiente, pois você pode sentir falta delas. Fazer uma instalação completa em uma máquina limpa é a única solução segura, IMO.

Se você não deseja configurar um ambiente de teste completo e possui o Windows 7, pode usar o Modo XP como a máquina limpa inicial e o XP-More para duplicar a VM.

Eran
fonte
6

Na sua máquina de desenvolvimento, você pode executar o programa e executar o Sysinternals Process Explorer . No painel inferior, ele mostrará as DLLs carregadas e os caminhos atuais para elas, o que é útil por vários motivos. Se você estiver executando o pacote de implantação, ele revelará quais DLLs são referenciadas no caminho errado (ou seja, não foram empacotadas corretamente).

Atualmente, nossa empresa usa projetos do Visual Studio Installer para percorrer a árvore de dependência e produzir como arquivos soltos o programa. No VS2013, agora é uma extensão: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Em seguida, empacotamos esses arquivos soltos em um instalador mais abrangente, mas pelo menos essa instalação projeta todas as dependências da rede de pontos e as coloca no mesmo local e avisa quando falta alguma coisa.

Shiv
fonte
2

No passado (dias WinXP), eu costumava depender / confiar no DLL Dependency Walker (depends.exe), mas há momentos em que ainda não consigo determinar os problemas da DLL. Idealmente, gostaríamos de descobrir antes do tempo de execução por inspeções, mas se isso não resolver o problema (ou demorar muito tempo), você poderá tentar ativar o "snap do carregador", conforme descrito em http://blogs.msdn.com/ b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspx e https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx e brevemente mencionado LoadLibrary falha; GetLastError sem ajuda

AVISO: Eu estraguei meu Windows no passado brincando com o gflag, fazendo-o rastejar de joelhos, você foi avisado.

insira a descrição da imagem aqui

Nota: "Snap do carregador" é por processo para que a ativação da interface do usuário não fique marcada (use cdb ou glfags -i)

HidekiAI
fonte
2

O NDepend já foi mencionado por Jesse (se você analisar o código .NET), mas vamos explicar exatamente como ele pode ajudar.

Existe um programa / script que pode verificar um executável em busca de dependências de DLL ou executar o programa em um ambiente livre de DLL "limpo" para teste para evitar essas situações opcionais?

No painel Propriedades do projeto NDepend, é possível definir o que são montagens de aplicativos a serem analisadas (em verde) e o NDepend deduzirá montagens de terceiros usadas por aplicações (em azul). Uma lista de diretórios onde procurar aplicativos e assemblies de terceiros é fornecida.

Aplicativo de propriedades do projeto NDepend e montagens de terceiros

Se um assembly de terceiros não for encontrado nesses diretórios, ele estará no modo de erro. Por exemplo, se eu remover o diretório .NET Fx, C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319posso ver que os assemblies de terceiros do .NET Fx não foram resolvidos:

Aplicativo de propriedades do projeto NDepend e assemblies de terceiros não resolvidos

Isenção de responsabilidade: trabalho para o NDepend

Patrick da equipe NDepend
fonte
1

Por favor, procure "depends.exe" no google, é um pequeno utilitário para lidar com isso.

shiying yu
fonte
7
Observe que o walker de dependência é bastante antigo e não coopera bem com 64 bits. Ele mostrará definitivamente todas as DLLs dependentes, que é o que o OP está procurando, mas também adiciona ruído - você verá que é executável em 32 bits com algumas dlls de 64 bits e assim por diante ... Infelizmente, ainda não há melhor alternativo.
eran
@eran E agora? Existe uma alternativa melhor agora? Obrigado.
Nikos
@ RestlessC0bra Não que eu saiba, mas não desenvolvo o Windows nos últimos 5 anos. O caminhante da dependência está morto, com certeza, e é uma pena que a Microsoft não tenha se incomodado em atualizar essa ferramenta útil nem aberto sua fonte para que outros possam mantê-la viva.
18717
1
@eran Nenhum DW não está morto. Aparentemente, ainda é usado extensivamente. Existem algumas outras ferramentas, mas o DW ainda é provavelmente o melhor.
Nikos
@ RestlessC0bra: Dependency Walker está morto. Nunca alcançou os módulos de 64 bits. Se você observar com bastante atenção, grande parte desse uso extensivo do Dependency Walker leva a perguntas sobre o estouro de pilha, perguntando por que algo está acontecendo. Que algo nunca acontece, no entanto. É apenas um falso negativo / positivo. O Process Monitor deve ser sua ferramenta preferida.
IInspectable
1

Se você possui o código fonte, pode usar ndepend.

http://www.ndepend.com/

É caro e faz muito mais do que analisar dependências, portanto pode ser um exagero para o que você está procurando.

Jesse
fonte
3
Sendo uma ferramenta especificamente adaptada para .NET, ela também analisa dependências para imagens nativas?
IInspectable
Provavelmente não, @IInspectable. Eu não acho que o .NET tenha uma maneira de fazer isso, exceto possivelmente usando algo P-Invoke.
precisa saber é o seguinte
@kayleeFrye_onDeck: a análise de tabelas de importação se resume à leitura de arquivos. O .NET pode ler arquivos.
11nspectable
Sim! E, no entanto, não há API .NET para fazer isso :( O que você sugere? Na verdade, eu não sou um programador .NET, apenas alguém que a utiliza quando soluções de nível inferior não dão certo. Existe uma seleção decente de ferramentas de inspeção lá fora, mas muito poucos para o Windows são compatíveis com a distribuição, muito menos rápido ... Eu estava procurando usá-lo para inspecionar uma quantidade desconhecida de binários recursivamente para detectar estruturas usadas quando compiladas, para que eu pudesse tratá-las com parâmetros especiais - Talvez eu deva investigar o uso de LoadLibraryEx...
kayleeFrye_onDeck
1
@kayleeFrye_onDeck: Não há nada na API do Windows para ler tabelas de importação de módulos. Você precisa ler os arquivos e analisar o conteúdo. Não há diferença entre código nativo e .NET. LoadLibraryExnão ajuda lá.
imprevisível 28/04
0

O projeto pedeps ( https://github.com/brechtsanders/pedeps ) possui uma ferramenta de linha de comando (copypedeps) para copiar seus arquivos .exe (ou .dll) junto com todos os arquivos dos quais depende. Se você fizer isso no sistema em que o aplicativo funciona, poderá enviá-lo com todas as DLLs de dependência.

Brecht Sanders
fonte
0

Experimente o JetBrains dotPeek . É grátis.

tedebus
fonte