2012-11-13 19 views
5

W moim kodzie mam interfejs - powiedzmy, że nazywa się InterfaceName, a jego implementacja nazywa się InterfaceImpl. Teraz, kiedy dynamicznie próbować uzyskać InterfaceImpl stosując następujący kod:Nie można przesłać System.Runtime.Remoting.ObjectHandle

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

I pojawia się następujący błąd

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

Wszelkie sugestie na temat tego, co może być nie tak?

+1

Użyj metody Unwrap(). –

Odpowiedz

22

If you read the documentation about the method you are calling, zwraca

uchwyt, który należy odwinąć aby uzyskać dostęp do nowo utworzonej instancji.

Patrząc na dokumentacji ObjectHandle, wystarczy zadzwonić Unwrap() w celu uzyskania instancji typu próbujesz stworzyć.

Więc, domyślam się, że twoim prawdziwym problemem jest ... Dlaczego?

Ta metoda została zaprojektowana do wywoływania w kolejnym AppDomain, a uchwyt powrócił do wywołującego AppDomain, gdzie proxy do wystąpienia jest "rozpakowane".

Co? To nie wyjaśnia, dlaczego?

Tylko dwa typy mogą przekroczyć barierę AppDomain. Typy podlegające serializacji (z których kopie są tworzone) i typy, które rozszerzają MarshalByRefObject (z których proksy są tworzone i przekazywane). ObjectHandle rozszerza się o MarshalByRefObject i może przekroczyć tę barierę AppDomain, a typ, który reprezentują, nie może rozszerzać MBRO lub z możliwością serializacji. Ta metoda gwarantuje, że możesz uzyskać tego typu instancję przez barierę, bez względu na wszystko.

Tak więc, jeśli próbujesz utworzyć instancję typu, możesz chcieć spojrzeć na inne przeciążenie CreateInstance. Lub po prostu rozwiń wynik.

+0

Dzięki, że udało się –

+2

Można również użyć [CreateInstanceAndUnwrap] (http://msdn.microsoft.com/en-us/library/3c4f1xde.aspx), który wykonuje to samo zadanie w jednym kroku (jeśli istnieje domyślny konstruktor) – Askolein

Powiązane problemy