มีสิ่งที่ชอบ:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
ดังนั้นแทนที่จะวนลูปAppDomain.CurrentDomain.GetAssemblies()
เราสามารถรับแอสเซมบลีเฉพาะได้โดยตรง
มีสิ่งที่ชอบ:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
ดังนั้นแทนที่จะวนลูปAppDomain.CurrentDomain.GetAssemblies()
เราสามารถรับแอสเซมบลีเฉพาะได้โดยตรง
คำตอบ:
ฉันแก้ไขด้วย LINQ
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
ขึ้นอยู่กับว่าคุณพยายามทำอะไรให้สำเร็จ
หากคุณต้องการรับชุดประกอบคุณควรโทร System.Reflection.Assembly.Load()
(ตามที่ระบุไว้แล้ว) นั่นเป็นเพราะ. NET จะตรวจสอบโดยอัตโนมัติว่ามีการโหลดแอสเซมบลีลงใน AppDomain ปัจจุบันแล้วหรือไม่และจะไม่โหลดอีกครั้งหากได้รับ
หากคุณแค่พยายามตรวจสอบว่ามีการโหลดแอสเซมบลีหรือไม่ (ด้วยเหตุผลในการวินิจฉัยบางอย่าง) คุณจะต้องวนซ้ำแอสเซมบลีที่โหลดทั้งหมด
อีกเหตุผลหนึ่งที่คุณอาจต้องการวนซ้ำคือหากคุณทราบข้อมูลการประกอบเพียงบางส่วน (เช่นคุณไม่แน่ใจในเวอร์ชัน) นั่นคือคุณรู้เพียงพอที่จะ "จำได้เมื่อคุณเห็น" แต่ไม่เพียงพอที่จะโหลด นั่นเป็นสถานการณ์ที่ค่อนข้างคลุมเครือและไม่น่าจะเป็นไปได้
สำหรับผู้ที่ต้องการเข้าถึงข้อมูลเมตาของแอสเซมบลี (เวอร์ชัน ฯลฯ ) โปรดดู Assembly.ReflectionOnlyLoad (ชื่อ) ซึ่งสามารถโหลดได้เฉพาะเมทาดาทาเท่านั้นซึ่งอาจช่วยประหยัดหน่วยความจำและ IO
หากนี่คือแอสเซมบลีที่คุณอ้างถึงฉันต้องการเขียนคลาสดังนี้:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
และเมื่อใดก็ตามที่คุณต้องการข้อมูลอ้างอิงไปยังแอสเซมบลีนั้น:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
คุณสามารถเขียนวิธีการขยายที่ตอบสนองสิ่งที่คุณต้องการ
วิธีนี้จะระบุเฉพาะแอสเซมบลีที่โหลดเท่านั้นหากคุณจำเป็นต้องโหลดให้ใช้Assembly.Load
จากคำตอบที่ยอมรับ
public static class AppDomainExtensions
{
public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
{
return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
}
}
จากนั้นคุณเรียกวิธีนี้บน AppDomain ดังนี้:
Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")
หากSomeAssemblyถูกโหลดลงใน AppDomain null
ปัจจุบันวิธีการที่จะกลับมามันมิฉะนั้นก็จะกลับ
ดูที่คลาส System.Reflection.Assembly โดยเฉพาะอย่างยิ่งวิธีการโหลด: MSDN
System.IO.FileNotFoundException
หากไม่สามารถโหลดชุดประกอบได้