2012-11-13 31 views
5

Trong mã của tôi, tôi có giao diện - cho phép gọi là giao diện InterfaceName và việc triển khai thực hiện được gọi là InterfaceImpl. Bây giờ khi tôi tự động cố gắng để có được những InterfaceImpl sử dụng đoạn mã sau:Không thể truyền System.Runtime.Remoting.ObjectHandle

object obj = Activator.CreateInstance("ProjectName","ProjectName.Folder.InterfaceImpl"); 
InterfaceName in = (InterfaceName)obj; //Error pops up here 

tôi nhận được lỗi sau

Unable to cast object of type 'System.Runtime.Remoting.ObjectHandle' to type 'ProjectName.Folder.InterfaceName'. 

Mọi góp ý về những gì có thể đi sai?

+1

Sử dụng phương thức Unwrap(). –

Trả lời

22

If you read the documentation about the method you are calling, nó sẽ trả

Một tay cầm phải được tháo để truy cập dụ mới được tạo ra.

Nhìn vào tài liệu của ObjectHandle, bạn chỉ cần gọi Unwrap() để nhận phiên bản loại bạn đang cố gắng tạo.

Vì vậy, tôi đoán vấn đề thực sự của bạn là ... Tại sao?

Phương pháp này được thiết kế để được gọi trong một AppDomain khác và xử lý được trả lại về số gọi AppDomain, trong đó proxy đối với cá thể là "chưa được mở".

Cái gì? Điều đó không giải thích tại sao?

Chỉ hai loại có thể vượt qua ngưỡng cản AppDomain. Các loại có thể tuần tự hóa (trong đó các bản sao được tạo) và các loại mở rộng MarshalByRefObject (trong đó proxy được tạo và thông qua). ObjectHandle kéo dài MarshalByRefObject và có thể vượt qua ngưỡng đó AppDomain, trong khi loại mà chúng đại diện không được mở rộng MBRO hoặc có thể được tuần tự hóa. Phương pháp này đảm bảo bạn có thể nhận được loại cá thể đó qua hàng rào, bất kể là gì.

Vì vậy, nếu bạn chỉ đang cố gắng thực hiện một loại, bạn có thể muốn xem xét quá tải khác nhau của CreateInstance. Hoặc chỉ cần unwrap kết quả.

var obj = Activator.CreateInstance("A","A.B.C") as ObjectHandle; 
InterfaceName in = (InterfaceName)obj.Unwrap(); 
+0

Cảm ơn bạn đã thực hiện thủ thuật –

+2

Bạn cũng có thể sử dụng [CreateInstanceAndUnwrap] (http://msdn.microsoft.com/en-us/library/3c4f1xde.aspx) thực hiện cùng một công việc trong một bước (nếu hàm tạo mặc định tồn tại) – Askolein

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