Gráfico de dependência de projetos do Visual Studio


130

Atualmente, estou migrando uma grande solução (~ 70 projetos) do VS 2005 + .NET 2.0 para o VS 2008 + .NET 3.5. Atualmente, tenho o VS 2008 + .NET 2.0.

O problema é que eu preciso mover os projetos um a um para a nova estrutura .NET, garantindo que nenhum projeto .NET 2.0 faça referência ao projeto .NET 3.5. Existe alguma ferramenta que me dê um bom gráfico das dependências do projeto?

Respostas:


39

Você já experimentou o NDepend? Ele mostra as dependências e você também pode analisar a usabilidade de suas classes e métodos.

O site deles:

http://ndepend.com


Para concluir a resposta da @Eriawan em abril de 2020, a versão 2020.1 do NDepend foi lançada com o Gráfico de Dependência completamente reconstruído. Agora, ele se baseia em grandes soluções feitas de centenas de projetos e oferece muitas facilidades de navegação.

Aqui está o que parece no projeto NopCommerce OSS .

Gráfico de dependência do NDepend no NopCommerce

Aqui está o que parece em toda a biblioteca de classes do .NET Core 3 (176 assemblies).

insira a descrição do link aqui

Disclaimer: Eu trabalho na NDepend


3
O pôster original não disse que o ndepend estava livre e resolve o problema.
Krystan honra

6
Pode ter sido gratuito no momento em que escrevemos esta resposta, mas agora não é.
Levente Koncz 07/01

@ patrick-from-ndepend-team, não edite diretamente minha resposta e abra uma nova resposta.
Eriawan Kusumawardhono 29/04

Ok @EriawanKusumawardhono desculpe se for um problema para você. Dessa forma, os leitores esclarecem mais detalhes e melhoram a utilidade da resposta. Deseja remover os detalhes e as capturas de tela extras?
Patrick da equipe NDepend

@PatrickfromNDependteam os detalhes extras e as capturas de tela estão OK. mas como essa é originalmente a minha resposta, parece que sua edição me faz parecer um trabalho no NDepend. Adicione uma nova resposta à sua edição e também enfatize que sua nova resposta é uma adição à minha resposta. Obrigado antes :)
Eriawan Kusumawardhono 16/06

169

Eu precisava de algo semelhante, mas não queria pagar (ou instalar) uma ferramenta para fazer isso. Eu criei um script PowerShell rápida que atravessa as referências do projeto e cospe-los para fora em um yuml.me -friendly formato em vez disso:

Function Get-ProjectReferences ($rootFolder)
{
    $projectFiles = Get-ChildItem $rootFolder -Filter *.csproj -Recurse
    $ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }

    $projectFiles | ForEach-Object {
        $projectFile = $_ | Select-Object -ExpandProperty FullName
        $projectName = $_ | Select-Object -ExpandProperty BaseName
        $projectXml = [xml](Get-Content $projectFile)

        $projectReferences = $projectXml | Select-Xml '//defaultNamespace:ProjectReference/defaultNamespace:Name' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text"

        $projectReferences | ForEach-Object {
            "[" + $projectName + "] -> [" + $_ + "]"
        }
    }
}

Get-ProjectReferences "C:\Users\DanTup\Documents\MyProject" | Out-File "C:\Users\DanTup\Documents\MyProject\References.txt"

4
impressionante. Peguei isso e o estendi para passar por todos os subprojetos, depois estendi novamente para pegar um arquivo sln em vez de mapear todo o projeto. Obrigado
Jon

Com quais versões do Visual Studio isso funciona? Além disso, para visualizar o C ++ em vez de projetos do C #, basta alterar o sufixo do arquivo .csproj para .vcproj? Trabalhando com VS 2005 aqui e eu recebo um arquivo de resultado vazio ...
SSC

1
Foi escrito contra um projeto de 2010 para C #, mas você provavelmente poderia ajustá-lo muito facilmente, olhando para o XML dentro de um projeto C ++ e ajustando o código :-)
Danny Tuppeny

5
código @ssc Há levemente atualizada colocado no meu blog que pode ser mais fácil de ajustar: blog.dantup.com/2012/05/...
Danny Tuppeny

5
Se você estiver usando o Powershell 2.0, precisará anexar =$trueos parâmetros MandatoryeValueFromPipeline
MoMo

79

Atualização: ReSharper desde a versão 8 possui o recurso interno 'Exibir dependências do projeto' .

A versão ReSharper <8 possui o recurso Interno para mostrar gráficos de dependência no uso do visualizador yFiles. Consulte o manual rápido na parte inferior da postagem.

insira a descrição da imagem aqui

Como

  1. Instale a ferramenta yEd a partir daqui .
  2. Execute o VS com o argumento de linha de comando /resharper.internal.
  3. Vá para ReSharper / Internal / Show Dependencies.
  4. Especifique os projetos que você deseja incluir na "imagem geral".
  5. Desmarque a opção 'Excluir nós de terminal ...', a menos que você precise.
  6. Pressione 'Mostrar'.
  7. Usar layout hierárquico em anos (Alt + Shift + H)
  8. Enviar feedback =)

2
Também ReSharper> Inspecionar> Projeto Hierarquia para obter a lista dos projetos que fazem referência no atual
Lu55

5
Resharper> Arquitetura> 'Mostrar diagrama de dependência do projeto'
Dr Blowhard 4/16

32

Você pode obter facilmente um gráfico de dependência do projeto usando o Visual Studio 2010 Ultimate. Digitalize para 5 minutos neste vídeo para ver como: http://www.lovettsoftware.com/blogengine.net/post/2010/05/27/Architecture-Explorer .aspx

No Visual Studio 2010 Ultimate: Arquitetura | Gerar gráfico de dependência | Por montagem.


@CJohnson Você pode fazer isso nos códigos C e C ++ se tiver o Visual Studio 2010 Feature Pack 2 . Veja também Como gerar dependência Gráficos para C e C ++ Código
Esther Fan - MSFT

1
Tentei, lançou uma exceção. Aparentemente, a MS nunca a testou com nada além de alguns projetos. Absolutamente inútil na minha opinião.
C Johnson

1
Não é só isso, é terrivelmente lento também. Eu faria isso -10 se pudesse. Eu escrevi meu próprio walker de dependência de projeto (para o nosso próprio sistema de compilação) e foi extremamente rápido em comparação com o visual studio.
C Johnson

@CJohnson Concordo que é lento e propenso a lançar exceções para grandes soluções, mas ainda é melhor do que nada. Consegui fazê-lo fechando todos os aplicativos, interrompendo alguns serviços e reiniciando o Visual Studio.
precisa saber é o seguinte

Grandes soluções para mim são cerca de 600 projetos com milhões de linhas de código. Nenhuma chance de interromper alguns serviços é uma solução aceitável para mim.
C Johnson

19

Eu escrevi uma ferramenta que pode ajudá-lo. O VS Solution Dependency Visualizer analisa as dependências do projeto em uma solução e cria um gráfico de dependência a partir dessas informações, bem como um relatório de texto.


Com quais versões do Visual Studio e com que tipo de projetos isso funciona? VS 2005 / C ++ para cá e a ferramenta não parece fazer nada ...
SSC

definitivamente funciona com vs 2008/2010 e .csproj / .vbproj. não fez teste com vs2005, mas atualmente .vcproj arquivos não são reconhecidos
devio

Isso só o arquivo mostra ferramenta solução após analisá-lo :-( Não meus cerca de 300 projectos..
thersch

@thersch se você quiser que eu dê uma olhada, zip .sln e arquivos de projeto (para que a estrutura de diretórios original seja preservada), carregue-a em um compartilhamento de arquivos e entre em contato comigo através do meu blog. thx
devio 3/08/17

9

Eu tive um problema semelhante, mas era ainda mais complicado porque vários projetos faziam referência a versões diferentes do mesmo assembly.

Para obter uma saída que inclui informações de versão e verifica possíveis problemas de carregamento de assembly em tempo de execução, criei esta ferramenta:

https://github.com/smpickett/DependencyViewer

(link direto para a versão do github: https://github.com/smpickett/DependencyViewer/releases )


1
Nice tool! Simples e eficiente. Obrigado por isso! +1 de mim.
Buka

Realmente ótima ferramenta! Eu sonhei com algo assim por anos. Muito obrigado por compartilhar!
Alehro 17/10

8

Você pode criar um gráfico de dependência de seus projetos no VS 2010 Ultimate. O Architecture Explorer permite procurar sua solução, selecionar projetos e os relacionamentos que você deseja visualizar e criar um gráfico de dependência a partir da sua seleção.

Para mais informações, consulte os seguintes tópicos:

Como gerar documentos de gráfico a partir do código : http://msdn.microsoft.com/en-us/library/dd409453%28VS.100%29.aspx#SeeSpecificSource

Como localizar código usando o Architecture Explorer : http://msdn.microsoft.com/en-us/library/dd409431%28VS.100%29.aspx

Download do RC : http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=457bab91-5eb2-4b36-b0f4-d6f34683c62a .

Fórum de Ferramentas de Modelagem e Descoberta Arquitetural do Visual Studio 2010 : http://social.msdn.microsoft.com/Forums/en-US/vsarch/threads


VS 2012 Professional também? Ou apenas o VS 2012 Ultimate?
precisa saber é o seguinte

@Kiquenet Você pode criar gráficos de dependência no VS 2012 Ultimate. Você pode abrir e fazer alterações limitadas no Premium e Pro.
Esther Fan - MSFT

5

Para concluir a resposta do eriawan nos gráficos gerados pelo NDepend, veja as sessões de tela abaixo. Você pode baixar e usar a edição de avaliação gratuita do NDepend por um tempo.

Mais sobre o gráfico de dependência do NDepend insira a descrição da imagem aqui

Mais sobre a matriz de dependência do NDepend : insira a descrição da imagem aqui

Isenção de responsabilidade: faço parte da equipe de ferramentas


NDepend é para .NET, a sua CppDepend clone é para C ++ e trabalha com .vcxproj arquivos
Patrick de NDepend equipa

5

A solução Powershell é a melhor. Eu o adaptei em um script bash que funciona na minha máquina (TM):

#!/bin/bash

for i in `find . -type f -iname "*.csproj"`; do
    # get only filename
    project=`basename $i`

    # remove csproj extension
    project=${project%.csproj}

    references=`cat $i | grep '<ProjectReference' | cut -d "\"" -f 2`
    for ref in $references; do
        # keep only filename (assume Windows paths)
        ref=${ref##*\\}

        # remove csproj extension
        ref=${ref%.csproj}

        echo "[ $project ] -> [ $ref ]"
    done

done




1

Esta versão estendida do Script PS de Danny Tuppeny mostra as referências de projeto e externas:

Function Get-ProjectReferences($rootPath)
{
  $projectFiles = Get-ChildItem $rootPath -Filter *.csproj -Recurse
  $ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }

  $projectFiles | ForEach-Object {
    $projectFile = $_ | Select-Object -ExpandProperty FullName
    $projectName = $_ | Select-Object -ExpandProperty BaseName
    $projectXml = [xml](Get-Content $projectFile)

    $projectReferences = $projectXml | Select-Xml '//defaultNamespace:ProjectReference/defaultNamespace:Name' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text"
    $projectReferences | ForEach-Object {
        "PR:[" + $projectName + "]:[" + $_ + "]"
    }
  }

  $projectFiles | ForEach-Object {
    $projectFile = $_ | Select-Object -ExpandProperty FullName
    $projectName = $_ | Select-Object -ExpandProperty BaseName
    $projectXml = [xml](Get-Content $projectFile)

    $externalReferences = $projectXml | Select-Xml '//defaultNamespace:Reference/@Include' -Namespace $ns
    $externalReferences | ForEach-Object {
        "ER:[" + $projectName + "]:[" + $_ + "]"
    }

  }

}

Get-ProjectReferences "C:\projects" | Out-File "C:\temp\References.txt"

Ele fornecerá um arquivo separado por dois pontos que pode ser aberto e analisado no Excel.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.