À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 ?
windows
dll
dependencies
orlp
fonte
fonte
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.Respostas:
Try
Dependency Walker
(última atualização em 2006) ou uma reescrita moderna chamadaDependencies
.fonte
dumpbin
sobre dependência walker. msdn.microsoft.com/en-us/library/756as972.aspx | stackoverflow.com/a/28304716/3543437dumpbin
das ferramentas do Visual Studio (pasta VC \ bin) podem ajudar aqui:fonte
dumpbin.exe
é muito útil descobrir/dependents
e/imports
. Você também pode usá-lo em outras máquinas se copiarlink.exe
junto e verificar se o x86 Visual C ++ Runtime Redistributable correspondente (msvcr120.dll
para 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/PREREQUISITES
e não/DEPENDENTS
, deveriam ter estudado latim.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 comexe
,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 iniciar
Cygwin Terminal
. Agora você pode executar seus comandos favoritos do Linux, incluindo:UPD: Você
ldd
também pode usar o terminal git bash no Windows . Não é necessário instalar o cygwin, caso você já tenha o git instalado.fonte
$ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000)
. O utilitário dumpbin mostra todas as dependências corretamente.Descubra o caminho completo do arquivo para a montagem com a qual você está tentando trabalhar
Pressione o botão Iniciar, digite "dev". Inicie o programa chamado "Prompt de Comando do Desenvolvedor para o VS 2017"
Na janela que se abre, digite
dumpbin /dependents [path]
onde[path]
está o caminho que você descobriu na etapa 1pressione a tecla Enter
Bam, você tem suas informações de dependência. A janela deve ficar assim:
Atualização para o VS 2019: você precisa deste pacote na instalação do VS:
fonte
fonte
depends
não suporta conjuntos de API, por isso é inútil para o Win7 +.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.
fonte
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.
fonte
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.
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)
fonte
O NDepend já foi mencionado por Jesse (se você analisar o código .NET), mas vamos explicar exatamente como ele pode ajudar.
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.
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.30319
posso ver que os assemblies de terceiros do .NET Fx não foram resolvidos:Isenção de responsabilidade: trabalho para o NDepend
fonte
Por favor, procure "depends.exe" no google, é um pequeno utilitário para lidar com isso.
fonte
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.
fonte
LoadLibraryEx
...LoadLibraryEx
não ajuda lá.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.
fonte
Consulte o kit de ferramentas SysInternal da Microsoft no link abaixo, https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
Vá para a pasta de download, abra "Procexp64.exe" como privilégio de administrador. Abra o Menu Find-> opção "Find Handle or DLL" ou atalho Ctrl + F.
fonte
Experimente o JetBrains dotPeek . É grátis.
fonte