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:
Tôi đã giải quyết bằng LINQ
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
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.
Đố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.
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;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
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.Load
từ 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
.
Hãy xem lớp System.Reflection.Assembly, cụ thể là phương thức Load: MSDN
System.IO.FileNotFoundException
xảy ra nếu không thể tải lắp ráp.