Chúng tôi triển khai một khung plugin cho ứng dụng của chúng tôi và lắp ráp các plugin bằng cách sử dụng Assembly.Loadfrom. Sau đó, chúng tôi sử dụng GetTypes() và kiểm tra thêm các loại với từng tệp plugin cho Giao diện được hỗ trợ.Assembly.GetTypes() - ReflectionTypeLoadException
Đường dẫn cho plugin được cung cấp bởi người dùng và chúng tôi xoay vòng qua từng tệp trong thư mục để xem liệu plugin (plugin) có hỗ trợ giao diện plugin của chúng tôi hay không. Nếu có, chúng ta tạo một thể hiện, nếu không chúng ta chuyển sang tập tin tiếp theo.
Chúng tôi xây dựng hai phiên bản phần mềm từ một cơ sở mã (appA_1 và appA_2).
Tải plugin hoạt động tốt khi các plugin được tải bởi ứng dụng được xây dựng cùng lúc với tệp plugin. Tuy nhiên, nếu chúng ta xây dựng appA_2 và trỏ đến thư mục plugin của appA_1, chúng ta sẽ có ngoại lệ khi GetTypes() được gọi.
Phiên bản cơ bản của mã của chúng tôi là;
var pluginAssembly = Assembly.LoadFrom(FileName);
foreach (var pluginType in pluginAssembly.GetTypes())
{
Chúng tôi nhận được ngoại lệ "ReflectionTypeLoadException".
Điều này có liên quan bởi vì chúng tôi muốn ứng dụng của chúng tôi có thể tải các loại plugin bất kỳ, được xây dựng bởi bất kỳ ai. Có cái gì chúng ta đang thiếu?
EDIT: Sau khi lặp qua LoaderExceptions, chúng tôi đã phát hiện ra rằng có một tệp libPublic.dll duy nhất tạo ra ngoại lệ System.IO.FileNotFoundException. Điều kỳ lạ là tệp này nằm trong thư mục ứng dụng và plugin được tham chiếu đến tệp dự án.
EDIT 2: Trong nhật ký ngoại lệ, chúng tôi tìm thấy những điều sau "So sánh tên lắp ráp dẫn đến việc không phù hợp: Revision Number"
Thông báo ngoại lệ là gì? Ngoại lệ có ngoại lệ bên trong không? Thông điệp đó là gì? – dtb
Bất kỳ lý do nào bạn không sử dụng một khung công tác hiện có như MEF? – dtb
Bạn vẫn có thể tạo ra các vấn đề như thế này khi sử dụng MEF, mặc dù MEF chắc chắn là tiện dụng cho việc chăm sóc công việc grunt. –