Cách "thích hợp" (MS được khuyến nghị) để thực hiện việc này, khi bạn phải sử dụng Type.GetType(string)
trên các loại trong các cụm không nằm trong ngữ cảnh tải nhưng trong ngữ cảnh tải từ hoặc không bối cảnh, là liên kết với Appdomain.AssemblyResolve
sự kiện. Các mã sau đây là tương đối hiệu quả:
// this resolver works as long as the assembly is already loaded
// with LoadFile/LoadFrom or Load(string)/Load(byte[])
private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
var asm = (from a in AppDomain.CurrentDomain.GetAssemblies()
where a.GetName().FullName == args.Name
select a).FirstOrDefault();
if(asm == null)
throw FileNotFoundException(args.Name); // this becomes inner exc
return asm;
}
// place this somewhere in the beginning of your app:
AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
Có vẻ hơi hiệu quả hơn để tạo ra một sự kết hợp của những sự kiện AssemblyLoad/Giải quyết để giữ một cuốn từ điển của assembly được nạp (sử dụng lắp ráp tên tuổi như key).
Khi được lắp ráp.LoadFile
Có một số hạn chế nghiêm trọng khi sử dụng phương pháp này. According to MSDN:
LoadFile không tải tệp vào LoadFrom context và không giải quyết các phụ thuộc bằng cách sử dụng đường dẫn tải, như phương thức LoadFrom.
Vì vậy, nếu có thể, không sử dụng LoadFile. Việc lắp ráp kết quả được nạp trong bối cảnh không bối cảnh, có nhiều hạn chế hơn so với ngữ cảnh tải-từ. Thay vào đó, hãy sử dụng Assembly.LoadFrom và các phụ thuộc sẽ được tải tự động từ đường dẫn tải.
Đây có phải là 'assembly' bằng cách nào đó liên quan đến ngôn ngữ lắp ráp không? –
@KirilKirov: Không. Đó là một loại trong .Net. –
@Austin - ah, cảm ơn :) Tôi đã bị lừa bởi thẻ. –