Làm thế nào để lấy C # .Net Assembly theo tên?


89

Có một cái gì đó như:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

vì vậy thay vì lặp lại AppDomain.CurrentDomain.GetAssemblies(), chúng ta có thể lấy trực tiếp cụm cụ thể.

Câu trả lời:



72

Tôi đã giải quyết bằng LINQ

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

7
Điều này sẽ chỉ hoạt động nếu lắp ráp được đề cập được tải. Có thể không giúp khi đăng ký các loại trong một Dal từ một API Web
Chazt3n

17

Nó phụ thuộc vào những gì bạn đang cố gắng hoàn thành.

Nếu bạn chỉ muốn lấy assembly, thì bạn nên gọi System.Reflection.Assembly.Load()(như đã chỉ ra). Đó là bởi vì .NET tự động kiểm tra xem assembly đã được tải vào AppDomain hiện tại chưa và không tải lại nếu đã được cài đặt.

Nếu bạn chỉ đang cố gắng kiểm tra xem cụm đã được tải hay chưa (có lẽ vì một số lý do chẩn đoán) thì bạn phải lặp lại tất cả các cụm đã được tải.

Một lý do khác mà bạn có thể muốn lặp lại là nếu bạn chỉ biết một số thông tin lắp ráp (ví dụ: bạn không chắc chắn về phiên bản). Tức là bạn biết đủ để "nhận ra khi nhìn thấy", nhưng chưa đủ để nạp. Tuy nhiên, đó là một viễn cảnh khá mờ mịt và khó xảy ra.


System.Reflection.Assembly.Load () hoàn hảo như những gì tôi cần.
Jronny

9

Đối với những người chỉ cần truy cập siêu dữ liệu của assembly (phiên bản, v.v.), hãy kiểm tra Assembly.ReflectionOnlyLoad (tên), chỉ có thể tải siêu dữ liệu, có thể lưu trên bộ nhớ và IO.


2
@ erik-reppen: Theo tài liệu MS, nó có sẵn trong các phiên bản trước. Tôi đang sử dụng nó trong một ứng dụng 3.5: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
codenheim

6

Nếu đây là một assembly mà bạn đã tham chiếu, tôi muốn viết một lớp như sau:

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

và sau đó bất cứ khi nào bạn cần tham chiếu đến assembly đó:

var assembly = MyLibraryAssembly.Value;

Đây là một giải pháp rất sạch mà tôi luôn tìm kiếm! Tôi có thể sử dụng nó như thế này:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer

3

Bạn có thể viết một phương thức mở rộng thực hiện những gì bạn cần.

Phương thức này sẽ chỉ liệt kê các tập hợp đã tải , nếu bạn có thể cần tải nó, hãy sử dụng Assembly.Loadtừ câu trả lời được chấp nhận.

public static class AppDomainExtensions
{
    public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
    {
        return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
    }
}

Sau đó, bạn gọi phương thức này trên AppDomain như thế này:

Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")

Nếu SomeAssembly được tải vào AppDomain hiện tại, phương thức sẽ trả về nó, nếu không nó sẽ trả về null.


Tôi không tìm thấy GetAssemblyByName ()
Ziggler

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.