2008-10-08 27 views
24

Tôi cố gắng thêm một hệ thống addons vào ứng dụng Windows.Net của tôi bằng cách sử dụng Reflection; nhưng nó không thành công khi có addon với dependencie.

Lớp Addon phải triển khai giao diện 'IAddon' và để có một hàm tạo rỗng.
chương trình chính tải addon sử dụng Reflection:Reflection.Net: làm thế nào để tải phụ thuộc?

Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\Addon.dll"); 
Type t = assembly.GetType("Test.MyAddon"); 
ConstructorInfo ctor = t.GetConstructor(new Type[] { }); 
IAddon addon= (IAddon) ctor.Invoke(new object[] { }); 
addon.StartAddon(); 

Nó hoạt động tuyệt vời khi addon không sử dụng dependencie. Nhưng nếu tham chiếu addon của tôi và sử dụng một DLL khác (C: \ Temp \ TestAddon \ MyTools.dll) được lưu gần addon trong đĩa, nó không thành công:
System.IO.FileNotFoundException: Không thể tải tệp hoặc lắp ráp 'MyTools.dll' hoặc một trong các phụ thuộc của nó.

Tôi không muốn sao chép phần bổ trợ DLL gần tệp thực thi của tôi, tôi có thể làm như thế nào để biết thời gian chạy .Net để tìm kiếm trong "C: \ Temp \ TestAddon \" cho bất kỳ phụ thuộc nào?

Lưu ý rằng việc thêm

Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll"); 

không thay đổi bất cứ điều gì.

Trả lời

35

Nếu MyTools.dll nằm trong cùng thư mục với Addon.dll, tất cả các bạn cần làm là gọi Assembly.LoadFrom thay vì Assembly.LoadFile để làm cho công việc mã của bạn. Nếu không, việc xử lý sự kiện AppDomain.AssemblyResolve là cách để thực hiện.

1

Couple lựa chọn:

  1. Bạn có thể gắn vào AppDomain.AssemblyResolve để giúp CLR giải quyết việc lắp ráp.
  2. Bạn có thể xem xét cách ly các trình bổ sung vào riêng của mình AppDomain (xem System.AddIn không gian tên và this website).
2

Bạn đã xem xét sử dụng vùng chứa Inversion Of Control chưa? Tôi sử dụng lâu đài Windsor với một tập tin Boo bên ngoài cho phép tôi dễ dàng mở rộng applcation mà không cần phải biên dịch lại hay lo lắng về việc cung cấp phụ thuộc

1

Bạn có thể sử dụng phản ánh để truy cập tin Assembly._GetReferencedAssemblies().

Mặc dù, phương pháp thể thay đổi trong một phiên bản tương lai của .NET framework, nó dường như không likely-ASP.NET rất nhiều phụ thuộc vào nó, mặc dù nó có thể họ có thể di chuyển nó mscorlib-System.Web đó là hội đồng duy nhất mà tôi biết từ nơi mà phương pháp được đề cập đến.

1

Assembly.LoadFrom hoạt động tốt cho đến khi tôi cố gắng sử dụng webService trong addon của mình, tôi đã có một "Không thể truyền đối tượng thuộc loại 'X' để nhập 'X'" ngoại lệ.

Rất xấu, nhưng tôi sẽ sử dụng Assembly.LoadFile với AppDomain.AssemblyResolve.

Xin cảm ơn các bạn.

Các vấn đề liên quan