2010-04-13 4 views
7

J'ai une application qui utilise des plugins qui sont gérés via une interface, puis je charge dynamiquement les classes de plugin et les envoie à l'interface pour les utiliser.Erreur de moulage avec réflexion

J'ai la ligne de code suivante, supposons que IPlugin est mon interface.

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

Ceci devrait être plutôt simple, créer l'instance et la transtyper dans l'interface. Je sais que l'assembly et les valeurs de nom complet sont corrects, mais j'obtiens l'exception suivante.

Exception = System.InvalidCastException: impossible à objet coulé de type « System.Runtime.Remoting.ObjectHandle » au type 'MyNamespace.Components.Integration.IPlugin. à MyNamespace.Components.Integration.PluginProxy..ctor (Int32 instanceId)

Toutes les idées ce qui pourrait être la cause?

Répondre

12

L'exception indique que vous obtenez un ObjectHandle, ce qui suggère que votre objet est marshalé et doit être déballés.

Effectuez les opérations suivantes

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

Comme vous pouvez le voir dans le documentation, cette surcharge renvoie un ObjectHandle object qui enveloppe la nouvelle instance. Le ObjectHandle ne peut pas être casté directement sur votre interface.
Au lieu de cela, vous devez appeler le Unwrap method, comme ceci:

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

aura-t-il pas besoin de jeter à 'ObjectHandle' d'abord, afin de' Déballer() '? – Jay

+0

@Jay: Non; il est déclaré comme renvoyant 'ObjectHandle'. Lisez la documentation. – SLaks