C #: รายชื่อคลาสทั้งหมดในแอสเซมบลี


103

ฉันต้องการเอาท์พุท (ทางโปรแกรม - C #) รายการคลาสทั้งหมดในแอสเซมบลีของฉัน

คำแนะนำหรือโค้ดตัวอย่างจะทำอย่างไร การสะท้อน?


หากคุณต้องการตรวจสอบชุดประกอบที่ไม่ได้อ้างอิงโดยโครงการของคุณโปรดดูคำตอบที่อัปเดตของฉัน
Thorarin

คำตอบ:


152

ใช้Assembly.GetTypes. ตัวอย่างเช่น:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}

1
ข้อเสนอแนะสำหรับการประกอบขนาดใหญ่หรือไม่? เมื่อฉันรันโค้ดนี้สำหรับแอสเซมบลีขนาด 13.8 MB อินสแตนซ์ VS ของฉันแฮงค์สำหรับสิ่งที่รู้สึกเหมือนไม่มีกำหนด ฉันลองประกอบขนาดเล็ก 9 KB และใช้งานได้ดี ฉันรู้ว่าคุณกำลังคิดอะไร - ทำไมคุณถึงมีแอสเซมบลีขนาด 13.8 MB ซึ่งเป็นส่วนหนึ่งของชั้นข้อมูลของฉันที่สร้างโดยใช้เทมเพลต NetTeirs เรามีโต๊ะมากมาย
dyslexicanaboko

1
@dyslexicanaboko: ถ้าคุณมีหลายประเภทจะต้องใช้เวลานานในการแจกแจงทั้งหมด ชุดประกอบของคุณมีกี่ประเภท? และคุณกำลังทำอะไรกับพวกเขา? (คุณแน่ใจหรือว่าปัญหาอยู่ที่การแยกประเภทหรือสิ่งที่คุณกำลังทำอยู่ในภายหลัง)
Jon Skeet

ฉันไม่สามารถผ่านการเรียก asm.GetTypes () ได้มันก็แฮงค์ - ฉันหมายความว่าเห็นได้ชัดว่ามีหลายประเภท - ฉันไม่สามารถทำอะไรได้เพราะมันกำลังเจาะไปที่การพยายามที่จะทำให้ได้ทั้งหมด . CPU ของฉันยิงได้ถึง 30% ในหนึ่งใน 4 คอร์ของฉัน ฉันหมายความว่าจริงๆฉันแค่สงสัยว่ามีวิธีพูดว่า "เฮ้ - ดูเฉพาะในเนมสเปซนี้เท่านั้น" - ฉันรู้สึกว่ามันเป็นไปไม่ได้เพราะเมธอด GetTypes () มีเพียงตัวสร้างที่ว่างเปล่า ฉันกำลังพยายามสร้างเบราว์เซอร์วัตถุแปลก ๆ
dyslexicanaboko

1
จุดดีฉันยังไม่ได้ลอง วิธีแก้ไขของฉันในตอนนี้คือกำหนดเป้าหมายชั้นเรียนโดยตรงโดยใช้ asm.GetType (fullyQualifiedClassName) ซึ่งใช้งานได้ แต่ไม่สามารถแสดงรายการคลาสให้กับผู้ใช้ได้ซึ่งเป็นสิ่งที่ฉันต้องการ นี่ไม่ใช่ลูกค้าที่ต้องเผชิญกับ btw ฉันกำลังใช้มันเป็นการภายในสำหรับตัวฉันเองและนักพัฒนาคนอื่น ๆ
dyslexicanaboko

1
@DebugErr: ใช่ - ก็พอง่ายที่จะทำให้มันเป็นเพียงแค่การเรียนถ้าคุณต้องการ แต่ฉันเดาว่า OP อาจจริงๆอยากทุกประเภท
Jon Skeet

102

ฉันแค่อยากจะเพิ่มตัวอย่างของจอน หากต้องการอ้างอิงถึงชุดประกอบของคุณเองคุณสามารถใช้:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection เนมสเปซ

หากคุณต้องการตรวจสอบแอสเซมบลีที่คุณไม่มีการอ้างอิงคุณสามารถใช้อย่างใดอย่างหนึ่งต่อไปนี้:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

หากคุณต้องการสร้างอินสแตนซ์ประเภทของคุณเมื่อคุณพบแล้ว:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

ดูเอกสารประกอบคลาส Assemblyสำหรับข้อมูลเพิ่มเติม

เมื่อคุณมีการอ้างอิงถึงAssemblyวัตถุคุณสามารถใช้assembly.GetTypes()เหมือนที่จอนแสดงให้เห็นแล้ว


ฉันจะอ้างอิงชุดประกอบที่แตกต่างกันโดยสิ้นเชิงที่อยู่ในโซลูชันของฉันได้อย่างไร
Alex

13
วิธีที่ง่ายที่สุดคือใช้typeofกับประเภทที่คุณรู้ว่าอยู่ในแอสเซมบลีนั้นแล้วตามด้วยAssemblyคุณสมบัติดังตัวอย่างของฉัน
Jon Skeet

2
หากคุณต้องการอ้างอิงแอสเซมบลีให้พูดว่า abc.dll นั่นอยู่ในโซลูชันของคุณและหากคุณตกลงฮาร์ดโค้ดชื่อ dll วิธีอื่นในการอ้างอิงแอสเซมบลีคือ: `Assembly assembly = Assembly.Load (" abc ");`
Kash

โหลดเฉพาะการประกอบปัจจุบัน ฉันมีแอปพลิเคชันหรือ exe ที่ใช้ 4 dll หรือโครงการ ฉันจะรับชื่อคลาสของ dll เหล่านั้นได้อย่างไร
Er Mayank

@JonSkeet สิ่งนี้จะเกิดขึ้นได้อย่างไรในสภาพแวดล้อม c # ที่ "ทันสมัย"? เช่นเมื่อทำการพัฒนา UWP. UWP ไม่มีเมธอด GetExecutingAssembly ()
Daniel Armstrong
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.