Cargar un Assembly (dll) dinámicamente (por código)

Antes o después tenemos que hacer aplicaciones que carguen dlls. El problema es que los Assemblys de .Net, aunque tenga la extensión dll, no son dlls de win32, por lo que el procedimiento “habitual” de carga no funciona.

Imaginad que tenemos la dll “MiExtension.dll” en C:\ (espero que nadie ponga en una aplicación real la ruta absoluta… esto es un ejemplo). De esa dll queremos cargar la clase “Controlador”.

Assembly miExtensionAssembly = Assembly.LoadFile(@"C:\MiExtension.dll");
Type miExtensionType = miExtensionAssembly.GetType("MiAplicacion.Controlador");
object miExtensionObjeto = Activator.CreateInstance(miExtensionType);
ITipoQueSea objetoFinal = (ITipoQueSea)miExtensionObjeto;

La primera línea carga el assembly, la segunda obtiene el tipo de la clase que se quiera (ojo, hay que darle toda la dirección del namespace, “Controlador” a secas no hubiera servido), la tercera instancia el objeto con el constructor por defecto y en la cuarta almaceno el Object con el tipo que sea.

Si necesitamos instanciar el objeto con un método que reciba parámetros, tendíamos que llamar a CreateInstance con dos parámetros, el primero el tipo (como en el ejemplo) y el segundo un array de Objects con los parámetros ordenados.

Por Carballude

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P

3 comentarios

  1. Compa.. tengo una duda con tu codigo.
    es con respecto a la cuarta linea.

    ya pude abrir el assembly lo instancio,
    pero como invoco uno de los metodos del assembly

  2. Para llamar a un método se hace lo siguiente:

    miExtensionObjeto.GetType().InvokeMember(«NombreMétodo», BindingFlags.InvokeMethod, Type.DefaultBinder, miExtensionObjeto, null);

    el último null es si el método no lleva parámetros.

    Saludos

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *