2016-05-25 20 views
5

Tôi có một dịch vụ plugin WCF plugin tải plugin thông qua MEF và chạy chúng.Cách được khuyến nghị để chạy plugin với dll phụ thuộc có phiên bản khác nhau là gì?

Mỗi plugin là một thư mục có nhiều dll thực hiện giao diện cụ thể.

Tôi tải tất cả các plugin trong cùng một AppDomain bằng MEF (DirectoryCatalog) và chạy chúng theo cách tổng quát (sử dụng sự phản chiếu).

Bây giờ cho phép giả sử tôi có hai plugins với phụ thuộc dll:

Plugin1 
    ----> Entities 1.0.0.1 

Plugin2 
    ----> Entities 1.0.0.2 

tôi đã thêm một số đơn vị mới trong 1.0.0.2.

Khi tôi chạy các plugin của tôi nhận được một lỗi lẻ tẻ rằng các thực thể mới không tồn tại trong dll.

Tôi đoán rằng lỗi xảy ra vì tôi đang chạy mã trong cùng một AppDomain và Entities.dll đầu tiên tải là mã sẽ phân phối tất cả các plugin của tôi.

Vì vậy, làm cách nào tôi có thể chạy từng plugin riêng lẻ, mà không cần tạo một tên miền ứng dụng mới?

Có cách nào tôi có thể nói MEF để tải tất cả các phụ thuộc plugin bằng cách nào đó không?

Tôi đã đọc về một vài giải pháp trên web:

  1. Tạo một appdomain mới cho mỗi plugin - Tôi không muốn đến đó.

  2. Sử dụng <dependentAssembly> - Tính năng này không hoạt động khi lần đầu tiên tôi thử và tôi không muốn máy chủ plugin của mình được cập nhật về từng thay đổi phiên bản phụ thuộc lắp ráp. Ngoài ra, tôi muốn có thể chạy các plugin với các phiên bản lắp ráp khác nhau.

  3. Đăng ký hội đồng bằng tiếng lóng - Tôi chưa thử cách này và tôi không chắc giải pháp này có hoạt động hay không. Làm thế nào khuôn khổ sẽ biết rằng ông cần phải tải một hội đồng khác nhau? Làm thế nào là điều này khác nhau từ các hội đồng với các phiên bản khác nhau? Tôi có cần phải định cấu hình dịch vụ của mình bằng cách nào đó để thực hiện công việc này không?

Có ai có ý tưởng nào tốt hơn cho tôi không? Cách được khuyến nghị để chạy plugin bị cô lập là gì?

Trả lời

3

Bạn cần ký hợp đồng của mình Và đảm bảo phiên bản lắp ráp khác nhau trên mỗi phiên bản. Xem câu trả lời từ những điều sau đây: C# Load different versions of assembly to the same project

CLR hỗ trợ tải nhiều phiên bản của các hội đồng được đặt tên mạnh vào cùng một AppDomain. Điều này chỉ hoạt động mặc dù nếu hội đồng của bạn được đặt tên mạnh và mỗi người có một phiên bản khác với phiên bản khác.

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