วิธีการรับ C # .Net Assembly ตามชื่อ?


90

มีสิ่งที่ชอบ:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

ดังนั้นแทนที่จะวนลูปAppDomain.CurrentDomain.GetAssemblies()เราสามารถรับแอสเซมบลีเฉพาะได้โดยตรง

คำตอบ:



74

ฉันแก้ไขด้วย LINQ

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}

8
สิ่งนี้จะใช้ได้เฉพาะเมื่อมีการโหลดแอสเซมบลีที่เป็นปัญหาเท่านั้น อาจไม่ช่วยในการลงทะเบียนประเภทใน DAL จาก Web API
Chazt3n

17

ขึ้นอยู่กับว่าคุณพยายามทำอะไรให้สำเร็จ

หากคุณต้องการรับชุดประกอบคุณควรโทร System.Reflection.Assembly.Load() (ตามที่ระบุไว้แล้ว) นั่นเป็นเพราะ. NET จะตรวจสอบโดยอัตโนมัติว่ามีการโหลดแอสเซมบลีลงใน AppDomain ปัจจุบันแล้วหรือไม่และจะไม่โหลดอีกครั้งหากได้รับ

หากคุณแค่พยายามตรวจสอบว่ามีการโหลดแอสเซมบลีหรือไม่ (ด้วยเหตุผลในการวินิจฉัยบางอย่าง) คุณจะต้องวนซ้ำแอสเซมบลีที่โหลดทั้งหมด

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


System.Reflection.Assembly.Load () สมบูรณ์แบบพอ ๆ กับที่ฉันต้องการ
Jronny

9

สำหรับผู้ที่ต้องการเข้าถึงข้อมูลเมตาของแอสเซมบลี (เวอร์ชัน ฯลฯ ) โปรดดู Assembly.ReflectionOnlyLoad (ชื่อ) ซึ่งสามารถโหลดได้เฉพาะเมทาดาทาเท่านั้นซึ่งอาจช่วยประหยัดหน่วยความจำและ IO


2
@ erik-reppen: ตามเอกสาร MS มีอยู่ในเวอร์ชันก่อนหน้า ฉันใช้มันในแอป 3.5: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
codenheim

7

หากนี่คือแอสเซมบลีที่คุณอ้างถึงฉันต้องการเขียนคลาสดังนี้:

namespace MyLibrary {
   public static class MyLibraryAssembly {
      public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
   }
}

และเมื่อใดก็ตามที่คุณต้องการข้อมูลอ้างอิงไปยังแอสเซมบลีนั้น:

var assembly = MyLibraryAssembly.Value;

นี่เป็นวิธีแก้ปัญหาที่สะอาดมากที่ฉันมองหามาตลอด! ฉันสามารถใช้มันได้ดังนี้options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer

3

คุณสามารถเขียนวิธีการขยายที่ตอบสนองสิ่งที่คุณต้องการ

วิธีนี้จะระบุเฉพาะแอสเซมบลีที่โหลดเท่านั้นหากคุณจำเป็นต้องโหลดให้ใช้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ปัจจุบันวิธีการที่จะกลับมามันมิฉะนั้นก็จะกลับ


ฉันไม่พบ GetAssemblyByName ()
Ziggler

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