2010-04-16 21 views
6

Estoy intentando simplemente cargar un dll escrito en C# en tiempo de ejecución y crear una instancia de una clase en ese dll.Cargando dinámicamente un archivo DLL

Assembly a = Assembly.LoadFrom(@"C:\Development\DaDll.dll"); 
Type type = a.GetType("FileReleaseHandler", true); 
TestInterface.INeeedHelp handler = Activator.CreateInstance(type) as TestInterface.INeeedHelp; 

No hay errores se tiran, y si me paso a través del código que pueden caminar aunque el Clase FileReleaseHandler conforme se ejecuta el constructor, pero el valor del manejador es siempre nula.

¿Qué me falta aquí? o incluso hay una mejor manera en que debería ir sobre esto?

Respuesta

4

¿Dónde se define TestInterface.INeedHelp definido? Un problema común es si tienes la misma interfaz en varios ensambles. Si tanto la persona que llama como el conjunto cargados dinámicamente hacen referencia a la misma interfaz en el mismo conjunto, debería estar bien.

Una sutileza es que si el conjunto está en un directorio diferente al ensamblado de llamada, puede terminar de cargar una copia diferente del mismo conjunto, que puede ser muy irritante :(

+0

Este fue exactamente el problema. Tenía la interfaz definida en cada proyecto (uno con el dll dinámicamente cargado y otro con el .exe de llamada) Mismo código exacto pero 2 ubicaciones de diferencia. Tan pronto como rompí la interfaz y tuve el .exe de llamada y el dll cargado dinámicamente referencia la misma interfaz funcionó bien. Gracias Jon. Eso fue de gran ayuda. – etoisarobot

4

Intente configurar el resultado de Activator.CreateInstance directamente a un objeto y no a la conversión.

Es posible que FileReleaseHandler no implemente TestInterface.INeeedHelp, en cuyo caso, se establecerá en nulo a través de "como TestInterface.INeeedHelp".

+0

hecho. Lo primero que pensé fue comprobar que 'Activator.CreateInstance (type)' devuelva * algo *. Luego resuelve lo que debería ser. – ChrisF

1

Compruebe los conjuntos que se cargan en el dominio de la aplicación. ¿Hay dos ensamblados con la interfaz TestInterface.INeedHelp en él? Mi sospecha es que LoadFrom vincula este objeto creado a una TestInterface.INeedHelp diferente a la que está tratando de lanzar. Intenta hacer un downcast normal en lugar de uno llamado "seguro" y ver qué error obtienes.

0

El problema es que la El método LoadFrom carga el dll en el contexto "LoadFrom" que es diferente del contexto predeterminado. Las reglas de resolución de tipo para los tipos en este contexto difieren de las que está acostumbrado. Es posible que la interfaz INeedHelp como se define en su principal Desde el punto de vista del tiempo de ejecución, el módulo es diferente de la interfaz con el mismo nombre que viene del contexto LoadFrom. Esto hará que el molde (como TestINterface) devuelva nulo

Para ver si este es el caso, intente asignar el resultado a un objeto.

0

Me gustaría hacer algo como:

Assembly a = Assembly.LoadFrom(@"C:\Development\DaDll.dll"); 
object obj = a.CreateInstance("fullClassName",other params) as IMyType 
//(if it implements an interface you referenced) 
Cuestiones relacionadas