Como determino as dependências de um aplicativo .NET?
-
03-07-2019 - |
Pergunta
Como determino as dependências de um aplicativo .NET? Faz Walker dependência trabalhar com aplicativos gerenciados? Eu baixei o mais recente e tentei traçar o aplicativo, mas ele sai sem muita explicação. Se não funcionar com o .NET, existe outra ferramenta que me ajudaria a depurar um problema de carregamento de DLL em tempo de execução?
Solução
A dependência Walker trabalha em binários normais do Win32. Todas as dlls .NET e exe 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" - então isso é tudo o que o Walker de dependência lhe dirá.
Para ver em quais coisas seu aplicativo .NET realmente confia, você pode usar o tremendamente excelente .NET refletor do portão vermelho. (Editar: Observe que o .NET Reflector agora é um produto pago. Ilspy é gratuito e de código aberto e muito semelhante.)
Carregue sua DLL nele, clique com o botão direito do mouse e escolha 'Analisar' - você verá um item "depende de" que mostrará todas as outras DLLs (e métodos dentro dessas DLLs) que ele precisa.
Às vezes, pode ficar mais complicado, pois seu aplicativo depende do 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 Visualizador de log de ligação à montagem o que pode mostrar o que está acontecendo em tempo de execução
Outras dicas
Eu acho a pequena utilidade ASMSPY Uma ferramenta inestimável para resolver problemas com os conjuntos de carregamento. Ele lista todas as referências de montagem de assembléias gerenciadas, incluindo versões de montagem.
Execute -o em um prompt de comando no diretório do .dll
Com os seguintes argumentos:
asmspy . all
Instale -o rapidamente com chocolate:
choco install asmspy
Abra o arquivo de montagem em ildasm e olhe @ the .assemly extern no manifesto
Para navegar dependências do código .NET, você pode usar os recursos da ferramenta NDepend. A ferramenta propõe:
- uma Gráfico de dependência
- uma Matriz de dependência,
- e também alguns Consultas C# LINQ pode ser editado (ou gerado) para navegar dependências.
Por exemplo, essa consulta pode parecer:
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: (observe a métrica de código profundidade, 1 é para chamadores diretos, 2 para chamadores de chamadores diretos ...) (Observe também o botão de exportação para o gráfico para exportar o resultado da consulta para um Gráfico de chamada)
O gráfico de dependência se parece:
A matriz de dependência se parece:
A matriz de dependência é de fato menos intuitivo que o gráfico, mas é mais adequado para navegar seções complexas de código como:
Isenção de responsabilidade: eu trabalho para Ndepend
Você não precisa baixar e instalar aplicativos ou ferramentas do Shareware. Você pode fazer isso programado de .NET usando Assembly.GetReferencedAssemblies()
Assembly.LoadFile(@"app").GetReferencedAssemblies()
Se você estiver usando a cadeia de ferramentas mono, pode usar a monodis
Utilitário com o --assemblyref
Argumento para listar as dependências de uma montagem .NET. Isso funcionará em ambos .exe
e .dll
arquivos.
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
Exemplo de saída (.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
Ativar log de login de montagem Defina o valor do registro EnableLog em hklm software microsoft fusion para 1. Observe que você precisa reiniciar seu aplicativo (use iisreset) para que as alterações tenham algum efeito.
Dica: Lembre -se de desligar o log de fusão quando terminar, pois há uma penalidade de desempenho para ativá -lo.
É engraçado que eu tive um problema semelhante e não encontrei nada adequado e estava ciente de um bom velho Walker, então, no final, escrevi um.
Isso lida com o .NET especificamente e mostrará o que referências uma montagem tem (e ausente) recursivamente. Também mostrará dependências da biblioteca nativa.
É gratuito (para uso pessoal) e disponível aqui para qualquer pessoa interessada: www.netdepends.com
Feedback bem -vindo.
O Chkasm mostrará todas as dependências de uma assembléia específica de uma só vez, incluindo as versões, e permitirá facilmente procurar montagens na lista. Funciona muito melhor para esse fim do que o iLspy (http://ilspy.net/), que é o que eu costumava usar para esta tarefa.
Outro suplemento refletor útil que eu uso é o Matriz da estrutura de dependência. É realmente ótimo ver o que as aulas usam o quê. Além disso, é grátis.
Tente compilar seu conjunto .NET com a opção --staticlink:"Namespace.Assembly"
. Isso força o compilador a atrair todas as dependências em tempo de compilação. Se encontrar uma dependência que não for referenciada, fornecerá uma mensagem de aviso ou erro geralmente com o nome dessa montagem.
Namespace.Assembly
é a assembléia que você suspeita de ter o problema de dependência. Normalmente, apenas vinculando estaticamente esta montagem fará referência a todas as dependências transitivas.
Melhor aplicativo que eu vejo e uso, mostre DLLs perdidos/problemáticos:http://www.dependencywalker.com/