ฉันจะตรวจสอบการอ้างอิงของแอปพลิเคชัน. NET ได้อย่างไร


107

ฉันจะตรวจสอบการอ้างอิงของแอปพลิเคชัน. NET ได้อย่างไร ไม่อ้างอิง Walkerทำงานร่วมกับแอพพลิเคจัดการได้อย่างไร ฉันได้ดาวน์โหลดแอปล่าสุดและลองทำโปรไฟล์แอปแล้ว แต่มันก็ออกโดยไม่มีคำอธิบายมากนัก หากใช้ไม่ได้กับ. NET มีเครื่องมืออื่นที่จะช่วยแก้ปัญหาการโหลด DLL แบบรันไทม์หรือไม่

คำตอบ:


94

Dependency walker ทำงานบนไบนารี win32 ปกติ .NET dll และ exe ทั้งหมดมีส่วนหัวของต้นขั้วขนาดเล็กซึ่งทำให้ดูเหมือนไบนารีปกติ แต่ทั้งหมดที่กล่าวโดยทั่วไปคือ "โหลด CLR" - นั่นคือทั้งหมดที่วอล์คเกอร์พึ่งพาจะบอกคุณ

หากต้องการดูว่าแอป. NET ของคุณพึ่งพาสิ่งใดจริงคุณสามารถใช้ตัวสะท้อนแสง. NET ที่ยอดเยี่ยมอย่างมากจาก Red Gate (แก้ไข: โปรดทราบว่า. NET Reflector เป็นผลิตภัณฑ์ที่ต้องชำระเงินแล้วILSpyเป็นโอเพนซอร์สฟรีและคล้ายกันมาก)

โหลด DLL ของคุณลงในไฟล์คลิกขวาและเลือก 'วิเคราะห์' จากนั้นคุณจะเห็นรายการ "ขึ้นอยู่กับ" ซึ่งจะแสดง dll อื่น ๆ ทั้งหมด (และวิธีการใน dll เหล่านั้น) ที่ต้องการ

บางครั้งอาจทำให้ยุ่งยากกว่านี้เนื่องจากแอปของคุณขึ้นอยู่กับ X dll และ X dll มีอยู่ แต่ด้วยเหตุผลใดก็ตามไม่สามารถโหลดหรืออยู่ที่รันไทม์ได้

ในการแก้ไขปัญหาเหล่านั้น Microsoft มีAssembly Binding Log Viewerซึ่งสามารถแสดงให้คุณเห็นว่าเกิดอะไรขึ้นในขณะรันไทม์


ฉันคิดว่าคุณพลาด URL นั้นไปเล็กน้อย - มีการใส่. aspx ในข้อความลิงก์ ฉันหามันเจอ
Brian Stewart

โอ้ ... ใช่การควบคุมมาร์กดาวน์กินวงเล็บใน URL และน่าเสียดายที่ MSDN ใส่ (VS80) ทั้งหมดเป็น url ของ :-(
Orion Edwards

44
โปรดทราบว่าเมื่อต้นปี 2554. NET Reflector ไม่ฟรีอีกต่อไป โครงการ ILSpy แบบโอเพนซอร์สนั้นคล้ายกันมาก
โยโย่

1
Assembly Binding Log View v4.0.30319.1 ไม่สามารถใช้งานได้อย่างเต็มที่ รายการบันทึกจะไม่แสดงตามลำดับเวลาและคุณไม่สามารถจัดเรียงได้ จะแสดงเส้นทางที่ไม่พอดีกับตัวแสดงและคุณไม่สามารถปรับขนาดได้ เสียเวลาโดยสิ้นเชิง
Neutrino

dependencywalker.comคุณควรใส่ url ของสิ่งที่คุณพูดถึงโดยเฉพาะ ถ้าพวกเขาทำงาน
Toddmo

54

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

รันในพรอมต์คำสั่งในไดเร็กทอรีของ.dllอาร์กิวเมนต์ต่อไปนี้:

asmspy . all

ภาพหน้าจอเอาต์พุต asmspy

ติดตั้งอย่างรวดเร็วด้วย Chocolatey:

choco install asmspy

สามารถทำงานกับไฟล์ C # หรือมุมมอง Razor ได้หรือไม่? ฉันกำลังสร้างโครงการย่อยโดยการส่งออกมุมมองและตัวควบคุมบางส่วนจากโครงการ mvc ในขณะดำเนินการ และฉันต้องการทราบว่ามุมมองและคอนโทรลเลอร์เหล่านี้ต้องการการอ้างอิงใดเพื่อให้ฉันสามารถคัดลอกการอ้างอิงเหล่านี้ในขณะทำงานเพื่อให้โปรเจ็กต์ย่อยเผยแพร่ได้เป็นโปรเจ็กต์เว็บแยกต่างหากบน IIS
Rupendra

25

เปิดไฟล์แอสเซมบลีใน ILDASM และดู @ the .assembly extern ใน MANIFEST


1
ฉันสามารถดูเวอร์ชันของชุดประกอบที่เกี่ยวข้องด้วยวิธีนี้ได้หรือไม่ ฉันเห็นเฉพาะชื่ออ้างอิงเท่านั้นไม่ใช่เวอร์ชันด้วย
Michael R

อันที่จริงใช่ฉันสามารถดูเวอร์ชันของชุดประกอบที่อ้างอิงได้ด้วยวิธีนี้เช่นกันเมื่อคลิก "MANIFES T"
Michael R

1
ฉันชอบอันนี้ - ไม่จำเป็นต้องดาวน์โหลดยูทิลิตี้เพิ่มเติมใด ๆ หากคุณทำงานในสภาพแวดล้อมการพัฒนา
Dan Field

เมื่อแก้ไขข้อบกพร่องของแอปของบุคคลที่สามจะติดตั้งเฉพาะ ildasm กับลูกค้าของได้อย่างไร?
realtebo

18

ในการเรียกดูการอ้างอิงรหัส. NET คุณสามารถใช้ความสามารถของเครื่องมือ NDepend เครื่องมือเสนอ:

ตัวอย่างเช่นแบบสอบถามดังกล่าวอาจมีลักษณะดังนี้:

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 }

และผลลัพธ์ของมันดูเหมือนว่า: (สังเกตความลึกของเมตริกโค้ด1 สำหรับผู้โทรโดยตรง 2 สำหรับผู้โทรของผู้โทรโดยตรง ... ) (โปรดสังเกตปุ่มส่งออกไปยังกราฟเพื่อส่งออกผลลัพธ์การสืบค้นไปยังกราฟการโทร )

การอ้างอิง NDepend เรียกดูผ่านแบบสอบถาม C # LINQ

กราฟการอ้างอิงมีลักษณะดังนี้:

กราฟการพึ่งพา NDepend

เมทริกซ์การพึ่งพามีลักษณะดังนี้:

เมทริกซ์การพึ่งพา NDepend

เมทริกซ์การพึ่งพานั้นใช้งานง่ายน้อยกว่ากราฟโดยพฤตินัยแต่เหมาะสำหรับการเรียกดูส่วนที่ซับซ้อนของโค้ดเช่น:

NDepend Matrix เทียบกับกราฟ

Disclaimer: ฉันทำงานให้กับ NDepend


2
แพทริคน่าจะพูดถึงเขาเป็นผู้เขียนเครื่องมือที่ยอดเยี่ยมนั้น) มันคุ้มค่าที่จะตรวจสอบ +1 สำหรับการเขียน!
Mitch Wheat

1
นี่ฉันเพิ่งสังเกตตัวเอง ฉันชอบอ่านบล็อกโพสต์ของเขา - ฉันจะต้องลอง NDepend!
Brian Stewart

2
@MitchWheat - เช็คชื่อฮาฮา "แพทริคจากทีม NDepend"
kayleeFrye_onDeck

ใช้กับ VStudio ได้ไหม? เพื่อแก้ไขข้อบกพร่องของแอปของบุคคลที่สามบนพีซีของฉัน
realtebo

16

คุณไม่จำเป็นต้องดาวน์โหลดและติดตั้งแอพหรือเครื่องมือแชร์แวร์ คุณสามารถทำโปรแกรมได้จาก. NET โดยใช้Assembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()

9
สำหรับการแก้จุดบกพร่องเพื่อก็สะดวกมากขึ้นในการทำเช่นนี้ผ่าน [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies()PowerShell: มีข้อได้เปรียบที่ดีในการไม่ดาวน์โหลดหรือค้นหาตำแหน่ง Windows ที่ไม่ชัดเจนสำหรับเครื่องมือ +1
jpmc26

3
แก้ไขฉันถ้าฉันผิด แต่นี่จะทำให้คุณมีข้อผิดพลาดเดียวกันกับที่แอปพลิเคชันของคุณที่มีการอ้างอิงที่ขาดหายไปนั้นไม่มีประโยชน์มากนัก
jk

สิ่งนี้ใช้ได้เฉพาะเมื่อแอสเซมบลีถูกโหลดลงใน AppDomain แอสเซมบลีที่โหลดสำหรับ Reflection จะส่งคืนชุด null
เดวิดเอ. เกรย์

7

หากคุณใช้ Mono toolchain คุณสามารถใช้ monodisยูทิลิตี้ที่มี--assemblyrefข้อโต้แย้งที่จะแสดงรายการอ้างอิงของ .NET การชุมนุม สิ่งนี้จะใช้ได้กับทั้งสองไฟล์.exeและ.dllไฟล์

ตัวอย่างการใช้งาน:

monodis --assemblyref somefile.exe

ตัวอย่างผลลัพธ์ (.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

ตัวอย่างผลลัพธ์ (.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

5

เปิดใช้งานการบันทึกการผูกแอสเซมบลีตั้งค่ารีจิสทรี EnableLog ใน HKLM \ Software \ Microsoft \ Fusion เป็น 1 โปรดทราบว่าคุณต้องรีสตาร์ทแอปพลิเคชันของคุณ (ใช้ iisreset) เพื่อให้การเปลี่ยนแปลงมีผล

เคล็ดลับ:อย่าลืมปิดการบันทึกฟิวชันเมื่อคุณดำเนินการเสร็จแล้วเนื่องจากมีการเปิดใช้งานการบันทึกแบบฟิวชัน


5

เป็นเรื่องตลกที่ฉันมีปัญหาคล้าย ๆ กันและไม่พบสิ่งใดที่เหมาะสมและตระหนักดีว่า Dependency Walker รุ่นเก่าที่ดีในท้ายที่สุดฉันก็เขียนขึ้นมาเอง

สิ่งนี้เกี่ยวข้องกับ. NET โดยเฉพาะและจะแสดงว่าการอ้างอิงใดที่แอสเซมบลีมี (และขาดหายไป) แบบวนซ้ำ นอกจากนี้ยังแสดงการอ้างอิงไลบรารีดั้งเดิม

ฟรี (สำหรับการใช้งานส่วนตัว) และมีให้ที่นี่สำหรับทุกคนที่สนใจ: www.netdepends.com

www.netdepends.com

ยินดีรับข้อเสนอแนะ


โปรดเพิ่มการรองรับการลากและวางสำหรับการเปิดชุดประกอบ จะเป็นการดีถ้ามีการปรับใช้ XCOPY รวมถึงซอร์สโค้ด
gigaplex

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

@gigaplex ฉันจะจดขอบคุณทั้งสองข้อนี้ฉันจะดูว่าฉันทำอะไรได้บ้าง
Lloyd

1
Shift คลิกเพื่อเปิดต้นไม้และรายการย่อยทั้งหมดจะมีประโยชน์เช่นกัน
TS

1
จะแจ้งให้ฉันทราบได้อย่างไรว่าการอ้างอิงใดที่ขาดหายไป
realtebo

2

http://www.amberfish.net/

ChkAsm จะแสดงการอ้างอิงทั้งหมดของแอสเซมบลีเฉพาะพร้อมกันรวมทั้งเวอร์ชันและช่วยให้คุณค้นหาแอสเซมบลีในรายการได้อย่างง่ายดาย ทำงานได้ดีกว่า ILSpy ( http://ilspy.net/ ) มากซึ่งเป็นสิ่งที่ฉันเคยใช้สำหรับงานนี้


1
ในปี 2019 ไซต์ดังกล่าวดูเหมือนจะเป็นบล็อกที่ดูไม่สมบูรณ์ ...
McGuireV10

@ McGuireV10 เป็นอย่างนั้น ที่โชคร้าย และ Google อย่างรวดเร็วก็ไม่ทำให้แอปนั้นเข้าชมอีกต่อไป
mhenry1384

0

อีกสะท้อนที่มีประโยชน์เพิ่มในการใช้งานฉันนั่นคือการพึ่งพาโครงสร้างเมทริกซ์ มันยอดเยี่ยมมากที่ได้เห็นว่าคลาสใช้อะไร แถมยังฟรีอีกด้วย


ไม่แสดงหมายเลขเวอร์ชัน แต่น่าเสียดายที่อย่างน้อยเวอร์ชันที่ติดตั้งเป็นส่วนเสริม Visual Studio ก็ไม่ได้
mhenry1384

0

ลองรวบรวมของคุณ NET --staticlink:"Namespace.Assembly"ประกอบกับตัวเลือก สิ่งนี้บังคับให้คอมไพเลอร์ดึงการอ้างอิงทั้งหมดในเวลาคอมไพล์ หากพบการอ้างอิงที่ไม่ได้อ้างอิงก็จะแสดงคำเตือนหรือข้อความแสดงข้อผิดพลาดโดยปกติจะมีชื่อของแอสเซมบลีนั้น

Namespace.Assemblyเป็นแอสเซมบลีที่คุณสงสัยว่ามีปัญหาการพึ่งพา โดยปกติแล้วการเชื่อมโยงแอสเซมบลีนี้แบบคงที่จะอ้างอิงการอ้างอิงทั้งหมดในลักษณะสกรรมกริยา


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