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?

Foi útil?

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

asmspy output screenshot

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:

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)

NDepend dependencies browsing through C# LINQ query

O gráfico de dependência se parece:

NDepend Dependency Graph

A matriz de dependência se parece:

NDepend Dependency Matrix

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:

NDepend Matrix vs Graph

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

www.netdepends.com

Feedback bem -vindo.

http://www.amberfish.net/

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/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top