2012-01-14 30 views
5

Tôi có yêu cầu tải lắp ráp phiên bản khác (tôi đã có lắp ráp cùng tên trong ứng dụng của mình).Sử dụng đối tượng lớp trên các phiên bản khác nhau của cùng một assembly bằng cách sử dụng Reflection

Tôi có thể tải lắp ráp và tải phương pháp tôi cần gọi bằng cách sử dụng phản chiếu nhưng khi tôi đi gọi phương thức bằng cách chuyển đối tượng lớp của tôi làm đối số, tôi có ngoại lệ là đối tượng lớp không thể chuyển đổi thành loại tham số đối số.

Sample Code -

Assembly myAssembly = Assembly.LoadFrom("Assembly Path for assembly with different version"); 
object classObject = myAssembly.CreateInstance("ClassName"); 
Type classType = myAssembly.GetType("ClassName"); 
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance); 

// Creating an object of class in the latest assembly and need to pass this 
// to method in assembly with different version. 
ClassInBothVesions parameter = new ClassInBothVesions(); 

myMethod.Invoke(classObject, new object[] { parameter }); 

Đây tham số là một đối tượng của một lớp mà tôi có trong lắp ráp nhưng vì lớp tham số được tạo ra trong lắp ráp các phiên bản hiện tại. Và khi tôi cố gắng vượt qua nó với phương pháp lắp ráp trước đó, tôi có một ngoại lệ mà nó không thể được chuyển đổi.

Làm cách nào tôi có thể đạt được điều này? Hãy cho tôi biết trong trường hợp nếu tôi cần phải đưa vào một số thông tin thêm ở đây. Cảm ơn trước.

+0

Tôi có thể sai, nhưng theo như tôi hiểu, việc tải phiên bản khác của hội đồng yêu cầu miền ứng dụng khác. Nếu không, phiên bản đã tải sẽ được sử dụng. – Vlad

+0

Không, tôi có thể tải lắp ráp trong cùng một miền ứng dụng. Vấn đề duy nhất xuất hiện khi tôi cố gắng chuyển tham số được tạo trong phiên bản này sang phiên bản khác. Nếu tôi cố gắng gọi phương thức với đối tượng được tạo trong cùng một phiên bản sử dụng phản chiếu, nó hoạt động tốt .. –

+0

có thể trùng lặp của [Truyền đối tượng lớp trên các phiên bản lắp ráp khác nhau] (http://stackoverflow.com/questions/8871079/passing-class -objects-across-khác-lắp ráp phiên bản) –

Trả lời

2

Bạn nên kiểm tra Khung quản lý mở rộng (MEF). Nó làm cho những gì bạn muốn làm dễ dàng hơn nhiều và tóm tắt bạn khỏi phải lo lắng về AppDomains và các assembly khác nhau.

Edit:

Nếu bạn muốn sử dụng phản chiếu duy nhất để đạt được những gì bạn muốn, nó sẽ đòi hỏi một mô hình đối tượng linh hoạt trong ứng dụng của bạn. Những điều cơ bản của phương pháp này là những gì MEF loại bên dưới mui xe. Nơi bạn thực sự có được sức mạnh để làm điều này là từ. Net remoting, vì vậy tôi khuyên bạn nên đọc về điều đó.

Những gì bạn sẽ cần:

  • ứng dụng của bạn trong (lắp ráp A).

  • Kết hợp với mã lớp cũ (assembly C).

  • Lớp Trình tải từ xa sẽ hoạt động như proxy/từ xa của bạn đến AppDomain thứ hai.

  • Lớp proxy đại diện cho phiên bản cũ của lớp.

  • Hội B sẽ chứa lớp proxy của bạn và trình tải từ xa của bạn.

Đây là những gì bạn có thể thử:

  1. tải ứng dụng từ lắp ráp A.

  2. Tạo dụ AppDomain mới.

  3. Khởi tạo một thể hiện của lớp "Loader từ xa" của bạn trong AppDomain mới từ lắp ráp B.

    a. Điều này sẽ gây ra lắp ráp B được nạp vào AppDomain.

  4. Từ "Trình tải từ xa", lắp ráp C và khởi tạo lớp cũ của bạn, sau đó trả lại phiên bản của lớp proxy cho AppDomain gốc.

  5. Bây giờ hy vọng bạn có thể sửa đổi các phương thức của mình để chấp nhận phiên bản chung hơn của đối tượng (có thể là giao diện?) Mà proxy và phiên bản lớp mới của bạn đều có thể triển khai.

+0

+1 .. Cảm ơn, sẽ xem xét điều này .. Nhưng không thể tích hợp nó với ứng dụng của tôi ngay bây giờ. Có cách nào bằng cách sử dụng phản ánh .. ?? –

+0

Tôi đã cập nhật nó với một phương pháp phản chiếu duy nhất, mặc dù tôi muốn đề nghị bạn thực sự suy nghĩ lại những gì bạn đang cố gắng đạt được vì đây là một hoặc nhiều hơn một hack quá phức tạp. – doogle

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