กราฟการอ้างอิงของโครงการ Visual Studio


130

ฉันกำลังโอนย้ายโซลูชันขนาดใหญ่ (~ 70 โปรเจ็กต์) จาก VS 2005 + .NET 2.0 เป็น VS 2008 + .NET 3.5 ปัจจุบันฉันมี VS 2008 + .NET 2.0

ปัญหาคือฉันต้องย้ายโปรเจ็กต์ทีละโปรเจ็กต์ไปยังเฟรมเวิร์ก. NET ใหม่เพื่อให้แน่ใจว่าไม่มีการอ้างอิงโปรเจ็กต์. NET 2.0 โปรเจ็กต์. NET 3.5 มีเครื่องมือใดบ้างที่จะให้กราฟการอ้างอิงโครงการที่ดีแก่ฉัน

คำตอบ:


39

คุณเคยลอง NDepend หรือยัง? มันจะแสดงการอ้างอิงและคุณยังสามารถวิเคราะห์การใช้งานของคลาสและวิธีการของคุณได้อีกด้วย

เว็บไซต์ของพวกเขา:

http://ndepend.com


เพื่อให้คำตอบ @Eriawan เสร็จสมบูรณ์ในเดือนเมษายน 2020 NDepend เวอร์ชัน 2020.1 ได้รับการเผยแพร่พร้อมDependency Graph ที่สร้างขึ้นใหม่ทั้งหมด ตอนนี้ขยายไปยังโซลูชันขนาดใหญ่ที่สร้างจากหลายร้อยโครงการและมีสิ่งอำนวยความสะดวกในการนำทางมากมาย

นี่คือสิ่งที่ดูเหมือนว่าในโครงการ NopCommerce OSS

NDepend Dependency Graph บน NopCommerce

นี่คือสิ่งที่ดูเหมือนในไลบรารีคลาส. NET Core 3 ทั้งหมด (176 แอสเซมบลี)

ป้อนคำอธิบายลิงก์ที่นี่

ข้อจำกัดความรับผิดชอบ: ฉันทำงานที่ NDepend


4
ผู้โพสต์ต้นฉบับไม่ได้บอกว่า ndepend ฟรีและช่วยแก้ปัญหาได้
krystan ให้เกียรติ

6
ตอนที่เขียนคำตอบนี้อาจจะว่าง แต่ตอนนี้มันไม่ใช่แล้ว
Levente Koncz

@ patrick-from-ndepend-team โปรดอย่าแก้ไขคำตอบของฉันโดยตรงและเปิดคำตอบใหม่แทน
Eriawan Kusumawardhono

โอเค @EriawanKusumawardhono ขออภัยหากเป็นปัญหาสำหรับคุณ วิธีนี้ทำให้ผู้อ่านได้รับรายละเอียดมากขึ้นอย่างตรงไปตรงมาและช่วยเพิ่มประโยชน์ของคำตอบคุณต้องการให้ฉันลบรายละเอียดและภาพหน้าจอเพิ่มเติมหรือไม่
Patrick จากทีม NDepend

@PatrickfromND พึ่งพารายละเอียดเพิ่มเติมและภาพหน้าจอได้เป็นอย่างดี แต่เนื่องจากเดิมทีนี่เป็นคำตอบของฉันดูเหมือนว่าการแก้ไขของคุณทำให้ฉันดูเหมือนทำงานที่ NDepend โปรดเพิ่มคำตอบใหม่พร้อมกับการแก้ไขของคุณและเน้นย้ำคำตอบใหม่ของคุณคือคำตอบของฉัน ขอบคุณมาก่อน :)
Eriawan Kusumawardhono

170

ฉันต้องการสิ่งที่คล้ายกัน แต่ไม่ต้องการจ่าย (หรือติดตั้ง) เครื่องมือเพื่อทำ ฉันสร้างสคริปต์ PowerShell ฉบับย่อที่ผ่านการอ้างอิงโครงการและคายออกมาในรูปแบบที่เป็นมิตรyuml.meแทน:

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
น่ากลัว ฉันเอาสิ่งนี้และขยายเพื่อไปยังโครงการย่อยทั้งหมดจากนั้นขยายอีกครั้งเพื่อใช้ไฟล์ sln แทนเพื่อแมปโครงการทั้งหมด ขอบคุณ
จอน

Visual Studio รุ่นใดบ้างที่ใช้งานได้ นอกจากนี้ในการแสดงภาพ C ++ แทนโครงการ C # การเปลี่ยนคำต่อท้ายไฟล์. csproj เป็น. vcproj หรือไม่ ทำงานกับ VS 2005 ที่นี่และฉันได้รับไฟล์ผลลัพธ์ว่างเปล่า ...
ssc

1
มันถูกเขียนขึ้นต่อต้านโครงการ 2010 สำหรับ C # แต่คุณสามารถปรับแต่งได้อย่างง่ายดายโดยดู XML ภายในโครงการ C ++ และปรับรหัส :-)
Danny Tuppeny

5
@ssc มีโค้ดที่อัพเดทเล็กน้อยโพสต์ในบล็อกของฉันซึ่งอาจจะปรับแต่งได้ง่ายขึ้น: blog.dantup.com/2012/05/…
Danny Tuppeny

5
หากคุณกำลังใช้ Powershell 2.0 คุณจะต้องผนวก=$trueกับMandatoryและValueFromPipelineพารามิเตอร์
MoMo

79

อัปเดต: ReSharper ตั้งแต่เวอร์ชัน 8 มีคุณสมบัติ'View Project Dependencies' ในตัว

ReSharper เวอร์ชัน <8 มีคุณสมบัติภายในเพื่อแสดงกราฟการอ้างอิงในการใช้โปรแกรมดู yFiles ดูคู่มือฉบับย่อที่ด้านล่างของโพสต์

ป้อนคำอธิบายภาพที่นี่

ทำอย่างไร

  1. ติดตั้งเครื่องมือ Yed จากที่นี่
  2. รัน VS ด้วยอาร์กิวเมนต์บรรทัดคำสั่ง /resharper.internal
  3. ไปที่ ReSharper / Internal / Show Dependencies
  4. ระบุโครงการที่คุณต้องการรวมไว้ใน 'ภาพรวม'
  5. ยกเลิกการเลือก 'ไม่รวมโหนดเทอร์มินัล ... ' เว้นแต่คุณจะต้องการ
  6. กด 'แสดง'
  7. ใช้รูปแบบลำดับชั้นใน yEd (Alt + Shift + H)
  8. ให้ข้อเสนอแนะ =)

2
Resharper> ตรวจสอบ> ลำดับชั้นของโครงการเพื่อรับรายชื่อโครงการที่อ้างถึงในปัจจุบัน
Lu55

5
Resharper> Architecture> 'Show Project Dependency Diagram'
Dr Blowhard

32

คุณสามารถรับกราฟการอ้างอิงโครงการได้อย่างง่ายดายโดยใช้ Visual Studio 2010 Ultimate สแกนเป็นเวลา 5 นาทีในวิดีโอนี้เพื่อดูว่า: http://www.lovettsoftware.com/blogengine.net/post/2010/05/27/Architecture-Explorer ขอบ

ใน Visual Studio 2010 Ultimate: Architecture | สร้างกราฟการพึ่งพา | โดย Assembly.


@CJohnson คุณสามารถทำเช่นนี้สำหรับ C และ C ++ รหัสถ้าคุณมีVisual Studio 2010 Feature Pack 2 ดูวิธีการ: สร้างกราฟการอ้างอิงสำหรับรหัส C และ C ++
Esther Fan - MSFT

1
พยายามแล้วโยนข้อยกเว้น เห็นได้ชัดว่า MS ไม่เคยทดสอบกับโครงการอื่น ๆ ไร้ค่าอย่างยิ่งในความคิดของฉัน
C Johnson

1
ไม่เพียงแค่นั้นยังช้าอย่างน่ากลัวอีกด้วย ฉันจะทำให้มันเป็น -10 ถ้าทำได้ ฉันเขียนวอล์กเกอร์พึ่งพาโครงการของตัวเอง (สำหรับระบบบิลด์ของเราเอง) และมันเร็วมากเมื่อเทียบกับวิชวลสตูดิโอ
C Johnson

@CJohnson ฉันยอมรับว่ามันช้าและมีแนวโน้มที่จะทิ้งข้อยกเว้นสำหรับโซลูชันขนาดใหญ่ แต่ก็ยังดีกว่าไม่มีอะไรเลย ฉันทำให้มันใช้งานได้โดยปิดแอปพลิเคชันทั้งหมดหยุดบริการบางอย่างและรีสตาร์ท Visual Studio
WynandB

โซลูชันขนาดใหญ่สำหรับฉันคือประมาณ 600 โปรเจ็กต์ที่มีโค้ดนับล้านบรรทัด ไม่มีโอกาสที่การหยุดบริการบางอย่างเป็นวิธีแก้ปัญหาที่ยอมรับได้สำหรับฉัน
C Johnson

20

ฉันเขียนเครื่องมือที่อาจช่วยคุณได้ VS Solution Dependency Visualizerวิเคราะห์การอ้างอิงโครงการภายในโซลูชันและสร้างแผนภูมิการอ้างอิงจากข้อมูลนี้เช่นเดียวกับรายงานข้อความ


Visual Studio เวอร์ชันใดและโครงการประเภทใดที่ใช้งานได้ VS 2005 / C ++ ตรงนี้และดูเหมือนว่าเครื่องมือจะไม่ทำอะไรเลย ...
ssc

มันใช้งานได้กับ 2008/2010 และ. csproj / .vbproj ไม่ได้ทดสอบกับ vs2005 แต่ปัจจุบันไม่รู้จัก
ไฟล์

เครื่องมือนี้แสดงเฉพาะไฟล์โซลูชันหลังจากวิเคราะห์ :-( ไม่ใช่โครงการ 300 โครงการของฉัน
thersch

@thersch ถ้าคุณต้องการให้ฉันดูโปรด zip .sln และไฟล์โปรเจ็กต์ (เพื่อให้โครงสร้างไดเร็กทอรีเดิมถูกเก็บรักษาไว้) อัปโหลดในการแชร์ไฟล์และติดต่อฉันผ่านบล็อกของฉัน thx
devio

9

ฉันมีปัญหาที่คล้ายกัน แต่ก็มีความซับซ้อนมากขึ้นเนื่องจากมีหลายโครงการที่อ้างถึงแอสเซมบลีเดียวกันในเวอร์ชันต่างๆ

เพื่อให้ได้ผลลัพธ์ที่มีข้อมูลเวอร์ชันและตรวจสอบปัญหาการโหลดแอสเซมบลีรันไทม์ที่เป็นไปได้ฉันได้สร้างเครื่องมือนี้:

https://github.com/smpickett/DependencyViewer

(ลิงก์โดยตรงไปยัง github release: https://github.com/smpickett/DependencyViewer/releases )


1
เครื่องมือที่ดี! ง่ายและมีประสิทธิภาพ ขอบคุณสำหรับสิ่งนั้น! +1 จากฉัน
Buka

เครื่องมือที่ยอดเยี่ยมจริงๆ! ฉันฝันหาอะไรแบบนั้นมาหลายปี ขอบคุณมากสำหรับการแบ่งปัน!
alehro

8

คุณสามารถสร้างกราฟการพึ่งพาโครงการของคุณใน VS 2010 Ultimate Architecture Explorer ช่วยให้คุณสามารถเรียกดูโซลูชันของคุณเลือกโครงการและความสัมพันธ์ที่คุณต้องการแสดงภาพจากนั้นสร้างกราฟการอ้างอิงจากสิ่งที่คุณเลือก

สำหรับข้อมูลเพิ่มเติมโปรดดูหัวข้อต่อไปนี้:

วิธีการ: สร้างเอกสารกราฟจากโค้ด : http://msdn.microsoft.com/en-us/library/dd409453%28VS.100%29.aspx#SeeSpecificSource

วิธีการ: ค้นหาโค้ดโดยใช้ Architecture Explorer : http://msdn.microsoft.com/en-us/library/dd409431%28VS.100%29.aspx

RC ดาวน์โหลด : http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=457bab91-5eb2-4b36-b0f4-d6f34683c62a

ฟอรัมVisual Studio 2010 Architectural Discovery & Modeling Tools : http://social.msdn.microsoft.com/Forums/en-US/vsarch/threads


VS 2012 Professional ด้วย? หรือเฉพาะ VS 2012 Ultimate?
Kiquenet

@Kiquenet คุณสามารถสร้างกราฟการพึ่งพาใน VS 2012 Ultimate คุณสามารถเปิดและทำการเปลี่ยนแปลงได้อย่าง จำกัด ใน Premium และ Pro
Esther Fan - MSFT

5

เพื่อให้คำตอบ eriawan สมบูรณ์บนกราฟที่สร้างโดย NDepend โปรดดูภาพหน้าจอด้านล่าง คุณสามารถดาวน์โหลดและใช้ NDepend รุ่นทดลองใช้ฟรีได้ชั่วขณะหนึ่ง

เพิ่มเติมเกี่ยวกับกราฟการพึ่งพา NDepend ป้อนคำอธิบายภาพที่นี่

เพิ่มเติมเกี่ยวกับเมทริกซ์การพึ่งพา NDepend : ป้อนคำอธิบายภาพที่นี่

ข้อจำกัดความรับผิดชอบ: ฉันเป็นส่วนหนึ่งของทีมเครื่องมือ


NDepend ใช้สำหรับ. NET โคลน CppDepend ใช้สำหรับ C ++ และทำงานกับไฟล์. vcxproj
แพทริคจากทีม NDepend

5

แก้ปัญหา Powershellที่ดีที่สุดคือ ฉันปรับให้เป็นสคริปต์ทุบตีที่ทำงานบนเครื่องของฉัน (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

4

คุณสามารถสร้างกราฟที่ดีของข้อมูลอ้างอิงในโครงการของคุณ ฉันได้อธิบายวิธีการทำในบล็อกของฉันแล้วhttp://www.mellekoning.nl/index.php/2010/03/11/project-references-in-ddd/


สิ่งที่คุณต้องทำคือเปลี่ยนเอาต์พุตเป็น DGML เพื่อแสดงภายใน VS: blogs.msdn.com/b/camerons/archive/2008/12/16/…
Richard


3

VS 2019 ได้เปลี่ยนชื่อโมดูลกราฟการอ้างอิงเป็น Code Map

นี่คือเอกสารอย่างเป็นทางการ: https://docs.microsoft.com/en-us/visualstudio/modeling/map-dependencies-across-your-solutions?view=vs-2019


"ในการสร้างและแก้ไขโค้ดแมปคุณต้องใช้ Visual Studio Enterprise edition ใน Visual Studio Community และ Professional editions คุณสามารถเปิดไดอะแกรมที่สร้างขึ้นใน Enterprise edition แต่คุณไม่สามารถแก้ไขได้"
MatthewT

1

เวอร์ชันเพิ่มเติมของสคริปต์ PS จาก Danny Tuppeny แสดงทั้งการอ้างอิงโครงการและภายนอก:

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"

มันจะให้ไฟล์ที่คั่นด้วยโคลอนซึ่งสามารถเปิดและวิเคราะห์ใน Excel


-1

ฉันได้ตรวจสอบคำตอบทั้งหมดแล้ว แต่ไม่มีตัวเลือกใดที่น่าพอใจสำหรับฉันดังนั้นฉันจึงเขียนเครื่องมือของตัวเองเพื่อดูตัวอย่างการอ้างอิงของโครงการ

https://github.com/Audionysos/VSProjectReferencesViewer

เป็นช่วงเริ่มต้น แต่ใช้ได้กับความต้องการของฉัน :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.