2010-04-13 10 views
7

Tengo una aplicación que usa complementos que se administran a través de una interfaz. A continuación, carga dinámicamente las clases de complementos y las transfiere a la interfaz para que trabajen con ellas.Casting Error with Reflection

Tengo la siguiente línea de código, supongo que IPlugin es mi interfaz.

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

Esto debería ser bastante simple, cree la instancia y ejecútelo en la interfaz. Sé que el ensamblaje y los valores de los nombres completos son correctos, pero recibo la siguiente excepción.

excepción = System.InvalidCastException: No se puede fundido objeto de tipo ‘System.Runtime.Remoting.ObjectHandle’ para escribir ‘MyNamespace.Components.Integration.IPlugin’. en MyNamespace.Components.Integration.PluginProxy..ctor (Int32 instanceId)

Cualquier idea qué podría causar esto?

Respuesta

12

La excepción indica que usted está recibiendo un ObjectHandle, lo que sugiere que su objeto se calculan las referencias y debe ser desenvuelto.

intente lo siguiente

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

Como puede ver en el documentation, esta sobrecarga devuelve un ObjectHandle object que envuelve la nueva instancia.

El ObjectHandle no se puede convertir directamente a su interfaz.
lugar, es necesario llamar a la Unwrap method, así:

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

¿No será que necesita para echar a 'ObjectHandle' en primer lugar, con el fin de' Separar() '? – Jay

+0

@Jay: No; se declara como devolver 'ObjectHandle'. Lee la documentación. – SLaks