Como determino as dependências de um aplicativo .NET?

106

Como determino as dependências de um aplicativo .NET? Faz Dependency Walker trabalho com aplicativos gerenciados? Eu baixei o mais recente e tentei criar o perfil do aplicativo, mas ele sai sem muitas explicações. Se não funcionar com o .NET, há alguma outra ferramenta que me ajudaria a depurar um problema de carregamento de DLL em tempo de execução?

Brian Stewart
fonte

Respostas:

94

Dependency walker funciona em binários win32 normais. Todas as DLLs e exe do .NET têm uma pequena parte do cabeçalho de stub que os faz parecer binários normais, mas tudo o que basicamente diz é "carregar o CLR" - isso é tudo o que o dependency walker lhe dirá.

Para ver em quais coisas seu aplicativo .NET realmente depende, você pode usar o tremendamente excelente refletor .NET da Red Gate. (EDITAR: Observe que o .NET Reflector agora é um produto pago. ILSpy é gratuito, de código aberto e muito semelhante.)

Carregue sua DLL nela, clique com o botão direito e escolha 'Analisar' - você verá um item "Depends On" que mostrará todas as outras DLLs (e métodos dentro dessas DLLs) de que precisa.

Às vezes, pode ficar mais complicado, pois seu aplicativo depende de X dll e X dll está presente, mas por qualquer motivo não pode ser carregado ou localizado em tempo de execução.

Para solucionar esses tipos de problemas, a Microsoft tem um Assembly Binding Log Viewer que pode mostrar o que está acontecendo no tempo de execução

Orion Edwards
fonte
Acho que você esqueceu um pouco desse URL - o .aspx foi colocado no texto do link. Mas consegui encontrar.
Brian Stewart,
oh ... sim, o controle de redução consome colchetes em URLs e, infelizmente, MSDN coloca (VS80) em todos os urls :-(
Orion Edwards,
44
Observe que, a partir do início de 2011, o .NET Reflector não é mais gratuito. O projeto ILSpy de código aberto é muito semelhante.
yoyo
1
O Assembly Binding Log View v4.0.30319.1 é totalmente inutilizável. As entradas de log não são exibidas em ordem cronológica e não podem ser classificadas. Ele exibe caminhos que não cabem no visualizador e não podem ser redimensionados. É uma completa perda de tempo.
Neutrino
dependencywalker.com Você deve incluir urls de coisas que mencionou, esp. se eles funcionam.
toddmo de
54

Acho o pequeno utilitário AsmSpy uma ferramenta inestimável para resolver problemas com o carregamento de assemblies. Ele lista todas as referências de assembly de assemblies gerenciados, incluindo versões de assembly.

Execute-o em um prompt de comando no diretório do .dllcom os seguintes argumentos:

asmspy . all

captura de tela de saída asmspy

Instale-o rapidamente com Chocolatey:

choco install asmspy
Alexander van Trijffel
fonte
Ele pode funcionar nos arquivos C # ou visualizações do Razor também? Estou criando um subprojeto exportando algumas visualizações e um controlador de um projeto mvc em tempo de execução. E eu quero saber quais dependências são exigidas por esses modos de exibição e o controlador para que eu possa copiar essas dependências também em tempo de execução para tornar o subprojeto publicável como um projeto da web separado no IIS.
Rupendra
25

Abra o arquivo de montagem no ILDASM e procure @ the .assembly extern no MANIFEST

Jim
fonte
1
Posso ver a versão dos assemblies dependentes dessa maneira também? Vejo apenas o nome da dependência, não sua versão também.
Michael R
Na verdade, sim, posso ver a versão dos assemblies dependentes desta forma também, clicando em "MANIFES T"
Michael R
1
Eu prefiro este - não preciso baixar nenhum utilitário adicional se você estiver trabalhando em um ambiente de desenvolvimento
Dan Field
Ao depurar uma falha de aplicativo de terceiros, como instalar apenas ildasm no cliente de?
realtebo
18

Para navegar pelas dependências do código .NET, você pode usar os recursos da ferramenta NDepend. A ferramenta propõe:

Por exemplo, essa consulta pode ser semelhante a:

from m in Methods 
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)") 
where depth  >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }

E seu resultado se parece com: (observe a profundidade da métrica do código , 1 é para chamadores diretos, 2 para chamadores de chamadores diretos ...) (observe também o botão Exportar para Gráfico para exportar o resultado da consulta para um Gráfico de Chamada )

Dependências NDepend navegando por meio de consulta C # LINQ

O gráfico de dependência se parece com:

Gráfico de Dependência NDepend

A matriz de dependência é semelhante a:

Matriz de Dependência NDepend

A matriz de dependência é de fato menos intuitiva do que o gráfico, mas é mais adequada para navegar por seções complexas de código como:

NDepend Matrix vs Graph

Aviso: Eu trabalho para NDepend

Patrick da equipe NDepend
fonte
2
Patrick provavelmente deveria ter mencionado que ele é o autor dessa ferramenta fantástica;). Vale a pena conferir. 1 para escrevê-lo!
Mitch Wheat
1
Ei, acabei de perceber isso sozinho. Gosto de ler suas postagens no blog - vou ter que experimentar o NDepend!
Brian Stewart
2
@MitchWheat - nome confere haha, "Patrick da equipe NDepend"
kayleeFrye_onDeck
Posso usar com o VStudio? Para depurar falhas de aplicativos de terceiros em não meu pc
realtebo
16

Você não precisa baixar e instalar aplicativos ou ferramentas shareware. Você pode fazer isso de forma programática a partir do .NET usandoAssembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()
Coronel Panic
fonte
9
Para fins de depuração, é mais conveniente para fazer isso via PowerShell: [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies(). Tem a vantagem de não baixar ou procurar ferramentas em locais obscuros do Windows. +1
jpmc26
3
corrija-me se eu estiver errado, mas isso só vai dar a você o mesmo erro que seu aplicativo com uma dependência ausente dá, então não é muito útil
jk.
Isso funciona apenas quando o assembly é carregado em um AppDomain. Assemblies carregados para Reflection retornam um conjunto nulo.
David A. Gray
7

Se você estiver usando o conjunto de ferramentas Mono, poderá usar o monodisutilitário com o --assemblyrefargumento para listar as dependências de um assembly .NET. Isso funcionará em arquivos .exee .dll.

Exemplo de uso:

monodis --assemblyref somefile.exe

Exemplo de saída (.exe):

$ monodis --assemblyref monop.exe
AssemblyRef Table
1: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

Saída de exemplo (.dll):

$ monodis --assemblyref Mono.CSharp.dll
AssemblyRef Table
1: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=System.Core
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
3: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
4: Version=4.0.0.0
    Name=System.Xml
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
Alexander O'Mara
fonte
5

Habilitar log de associação de assembly defina o valor do registro EnableLog em HKLM \ Software \ Microsoft \ Fusion como 1. Observe que você deve reiniciar seu aplicativo (use iisreset) para que as alterações tenham efeito.

Dica: Lembre-se de desligar o registro de fusão quando terminar, pois há uma penalidade de desempenho em tê-lo ativado.

Ramesh
fonte
5

É engraçado que eu tive um problema semelhante e não encontrei nada adequado e conhecia o bom e velho Dependency Walker, então no final eu mesmo escrevi um.

Isso lida especificamente com o .NET e mostrará quais referências um assembly tem (e faltam) recursivamente. Ele também mostrará as dependências da biblioteca nativa.

É gratuito (para uso pessoal) e está disponível aqui para todos os interessados: www.netdepends.com

www.netdepends.com

Feedback bem-vindo.

Lloyd
fonte
Adicione suporte de arrastar e soltar para a abertura de montagens. Também seria bom se a implantação do XCOPY estivesse disponível, assim como o código-fonte.
gigaplex
Acabei de notar que o site não tem nenhum link óbvio para a seção onde existem duas edições, e a gratuita é para uso não comercial. Eu acidentalmente tropecei nisso ao encontrar a opção "Atualizar para profissional" no menu Ajuda. Deve haver um aviso na página de download dizendo que não é gratuito para uso comercial.
gigaplex
@gigaplex Vou tomar nota de ambos os agradecimentos, vou ver o que posso fazer.
Lloyd
1
Clique em Shift para abrir uma árvore e todos os subitens também serão úteis.
TS
1
Como me informar quais são as dependências ausentes?
realtebo
2

http://www.amberfish.net/

O ChkAsm mostrará todas as dependências de um determinado assembly de uma vez, incluindo as versões, e permitirá que você procure por assemblies na lista. Funciona muito melhor para esse propósito do que ILSpy ( http://ilspy.net/ ), que é o que eu costumava usar para essa tarefa.

mhenry1384
fonte
1
Em 2019, esse site parecia ser uma espécie de blog de aparência incompleta ...
McGuireV10
@ McGuireV10 Assim é. Isso é lamentável. E uma rápida pesquisa no Google não mostra mais resultados para esse aplicativo.
mhenry1384
0

Outro suplemento útil do Reflector que uso é a Matriz de estrutura de dependência . É muito bom ver quais classes usam o quê. Além disso, é grátis.

Richard Morgan
fonte
Não mostra os números da versão, infelizmente, pelo menos a versão que instala como um suplemento do visual studio não.
mhenry1384
0

Tente compilar seu conjunto .NET com a opção --staticlink:"Namespace.Assembly". Isso força o compilador a obter todas as dependências em tempo de compilação. Se encontrar uma dependência não referenciada, ele dará um aviso ou mensagem de erro geralmente com o nome desse assembly.

Namespace.Assemblyé o assembly que você suspeita que tenha o problema de dependência. Normalmente, apenas vincular estaticamente este assembly fará referência a todas as dependências transitivamente.


fonte
-4

Melhor aplicativo que vejo e uso, mostra dlls perdidas / problemáticas: http://www.dependencywalker.com/

user1005462
fonte
2
Esta ferramenta não ajudará com assemblies .NET.
Kevin Panko de