Tôi đang cố gắng sử dụng sự kiện AppDomain.AssemblyResolve
để xử lý ngoại lệ trong khi giải quyết tập hợp của một số dll được tải khi chạy (SerializationException for dynamically loaded Type).Làm việc với sự kiện AppDomain.AssemblyResolve
Khi sự kiện là bắn, tôi tải tất cả các file DLL trong thư mục của mình và tạo ra một mảng Assembly
, sau đó tôi sử dụng phương pháp này để có được những Assembly
chứa loại I nêu rõ:
public static Assembly GetAssemblyContainingType(String completeTypeName, Assembly[] assemblies)
{
Assembly assembly = null;
foreach (Assembly currentassembly in assemblies)
{
Type t = currentassembly.GetType(completeTypeName, false, true);
if (t != null)
{
assembly = currentassembly;
break;
}
}
return assembly;
}
Vấn đề là đây mã chỉ hoạt động với một số AssemblyQualifiedName
và ResolveEventArgs.Name
do sự kiện này cung cấp không hữu ích.
Bạn có thể đề xuất cho tôi một số giải pháp khác không?
Có cách nào để chuyển một số đối số khác cho sự kiện khi sự kiện được kích hoạt không?
Không nạp trước các assembly có thể giảm bớt sự cần thiết cho một trình xử lý sự kiện AssemblyResolve không? –
@mikez Theo như tôi biết, chỉ cần tải một assembly bằng cách sử dụng 'Assembly.Load (assemblyName)' không tự động làm cho nó có sẵn cho mã phân giải lắp ráp của miền ứng dụng của bạn (trừ khi mã đó có thể truy cập assembly bằng cách sử dụng độ phân giải mặc định quá trình). Mã này được gỡ bỏ từ một hệ thống làm việc (tôi đã xóa mã xử lý lỗi, ví dụ: xung quanh lệnh 'bổ sung.TryGetValue (e.Name, out res)' để đơn giản hóa mọi thứ một chút). Khi tôi loại bỏ móc 'ResolveAssembly', hệ thống làm việc của tôi ngừng hoạt động :) – dasblinkenlight
Khi bạn đang xây dựng từ điển, hãy sử dụng AssemblyName.GetAssemblyName () thay vì Assmebly.Load để lấy tên assembly thành ánh xạ tên tệp và tránh vô điều kiện tải tất cả các hội đồng. –