2012-01-18 21 views
5

Chúng tôi đang xây dựng một ứng dụng .NET nơi chúng tôi tải các assembly mã bên ngoài ("plugins"). Tính đến thời điểm này, chúng tôi đã tải các assembly này vào một miền ứng dụng (chính) duy nhất.Cách xử lý trao đổi dữ liệu miền ứng dụng chéo

Chúng tôi muốn có thể dỡ tải một hội đồng sau khi nó đã được tải.

Để kết thúc này, chúng tôi đang thiết kế một hệ thống sẽ tạo ra một AppDomain phụ riêng biệt để lưu trữ các hội đồng plugin, để được dỡ theo ý muốn.

Những vấn đề chúng tôi có với cách tiếp cận này:

  1. Plugin DLL sẽ cần phải tương tác với các lớp trong AppDomain chính (logger, ví dụ).
  2. Dữ liệu được gửi tới dll plugin không nhất thiết phải được đánh dấu là có thể nối tiếp hoặc được lấy từ MarshalByRefObj.

Có thực tiễn phổ biến nào trong việc phân vùng ứng dụng trong các trường hợp như vậy không? Giải pháp tốt nhất chúng ta có thể làm là gì?

Một câu hỏi thú vị khác - tại sao MarshalByRef không đi theo một thuộc tính và buộc chúng tôi lấy được từ một đối tượng?

+1

'Chúng tôi muốn có thể dỡ bỏ một hội đồng sau khi nó đã được tải 'http://stackoverflow.com/questions/6258160/unloading-the-assembly-loaded-with-assembly-loadfrom 1. Để tương tác trên các AppDomain riêng biệt có thể bạn sẽ cần thực hiện thông qua Remoting. 2. là một tuyên bố, bạn có thể chỉnh sửa để làm rõ rằng câu hỏi thứ 2 –

Trả lời

3

Cách đơn giản nhất để giao tiếp trên AppDomains là sử dụng AppDomain.CreateInstanceAndUnwrap. Điều này sẽ cho phép bạn khởi tạo một đối tượng trong một AppDomain khác và trả về một proxy cho đối tượng đó. Từ proxy, bạn có thể thực hiện các cuộc gọi phương thức hiệu quả trên miền ứng dụng.

Nếu các lớp học hiện tại của bạn không mở rộng MarshalByRef thì bạn nên tạo một lớp cầu nối và có thể hoạt động như một điểm giữa.

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