2010-04-13 12 views
7

Mam aplikację, która używa wtyczek zarządzanych przez interfejs, a następnie dynamicznie ładuję klasy wtyczek i przesyłam je do interfejsu, aby z nimi pracować.Błąd odlewania z odbiciem

Mam następujący wiersz kodu, zakładam, że IPlugin jest moim interfejsem.

IPlugin _plugin = (IPlugin)Activator.CreateInstance(oInfo.Assembly, oInfo.FullyQualifiedName) 

Powinno to być całkiem proste, utworzyć instancję i przesłać ją do interfejsu. Wiem, że złożenia i w pełni kwalifikowane wartości nazw są poprawne, ale otrzymuję następujący wyjątek.

Wyjątek = System.InvalidCastException: Nie można rzutować obiektu typu „System.Runtime.Remoting.ObjectHandle” wpisać „MyNamespace.Components.Integration.IPlugin”. na MyNamespace.Components.Integration.PluginProxy..ctor (Int32 instanceid)

Jakieś pomysły co może być przyczyną tego?

Odpowiedz

12

Wyjątek wskazuje, że jesteś coraz ObjectHandle, co sugeruje, że obiekt jest marshaled i należy odwinąć.

Wypróbuj następujące

ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly, Info.FullyQualifiedName); 
IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap(); 
7

Jak widać w documentation, to przeciążenie zwraca ObjectHandle object, który otacza nowe wystąpienie.

Urządzenie ObjectHandle nie może być przesyłane bezpośrednio do interfejsu użytkownika.
Zamiast tego, trzeba zadzwonić do Unwrap method, tak:

IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap(); 
+0

nie będzie musiał oddać do 'ObjectHandle' pierwsze, w celu' Unwrap() '? – Jay

+0

@Jay: Nie; jest zadeklarowany jako zwracający 'ObjectHandle'. Przeczytaj dokumentację. – SLaks

Powiązane problemy