2010-04-13 20 views
7

Ich habe eine Anwendung, die Plugins verwendet, die über eine Schnittstelle verwaltet werden. Ich lade dann dynamisch die Plug-in-Klassen und wirf sie auf die Schnittstelle, um mit ihnen zu arbeiten.Casting-Fehler mit Reflektion

Ich habe die folgende Codezeile, angenommen, dass IPlugin meine Schnittstelle ist.

Dies sollte ziemlich einfach sein, erstellen Sie die Instanz und werfen Sie es auf die Schnittstelle. Ich weiß, dass die Assembly und voll qualifizierte Namen Werte korrekt sind, aber ich bekomme die folgende Ausnahme.

exception = System.InvalidCastException: Kann nicht gegossene Objekt vom Typ ‚System.Runtime.Remoting.ObjectHandle‘ ‚MyNamespace.Components.Integration.IPlugin‘ einzugeben. bei MyNamespace.Components.Integration.PluginProxy..ctor (Int32 instanceId)

Irgendwelche Ideen, was könnte die Ursache sein?

Antwort

12

Die Ausnahme zeigt an, dass Sie eine ObjectHandle fühlt, was darauf schließen lässt, dass Ihr Objekt serialisiert werden und müssen ausgepackt werden.

Versuchen Sie, die folgende

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

Wie Sie in der documentation sehen können, gibt diese Überladung eine ObjectHandle object zurück, die die neue Instanz umschließt.

Die ObjectHandle kann nicht direkt an Ihre Schnittstelle übertragen werden.
Stattdessen müssen Sie die Unwrap method nennen, wie folgt aus:

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

Wird er nicht zuerst 'ObjectHandle' werfen müssen, um' Abwickelwerkzeug() '? – Jay

+0

@Jay: Nein; es wird deklariert, dass es "ObjectHandle" zurückgibt. Lesen Sie die Dokumentation. – SLaks

Verwandte Themen