Una forma sencilla para crear una instancia de un objeto existente en una DLL cargada dinámicamente es mediante el uso de AppDomain.CreateInstance. Si disponemos de una interfaz que implementa la clase del objeto (en tiempo de compilación) podemos crear el objeto en tiempo de ejecución y acceder directamente a los métodos declarados en la interfaz sin tener que recurrir a reflexión pura y dura.

System.Runtime.Remoting.ObjectHandle handle;

string assemblyName = string.Empty; //assembly donde esta la clase

string classToLoad = string.Empty; //nombre de la clase <namespace>.<nombre>

Assembly callingAssembly = null;

AppDomain appDomain = System.Threading.Thread.GetDomain();

Assembly[] assemblies = appDomain.GetAssemblies();

 

foreach (Assembly assembly in assemblies)

{

    if (assemblyName.Equals(assembly.FullName))

        callingAssembly = assembly;

}

 

if (callingAssembly == null)

    throw new NullReferenceException("No se encuentra el ensamblado.");

 

handle = appDomain.CreateInstance(callingAssembly.FullName, classToLoad, false, 0,

    null, new Object[] { /*parametros para el constructor*/ }, null, null, null);

 

MyInterface obj = (MyInterface) handle.Unwrap();

 

//obj.Metodo()...

Definiendo el ensamblado donde se encuentra la clase a instanciar (assemblyName) y la clase a instanciar (classToLoad) nos basta enlazar un objeto, hay que tener en cuenta que al especificar el nombre de la clase debemos incluir el namespace en el que ésta se encuentra sino, se producirá una excepción porque no se encontrará la clase.

El método CreateInstance consta de una serie de argumentos que utiliza para crear la instancia. Necesita que especifiquemos al menos el ensamblado y la clase a instanciar, y un array de objetos para especificar los argumentos del constructor (o null si no necesita). Además, podemos espeficicar indicadores de enlace, información específica de la referencia cultural utilizada para interpretar argumentos, atributos de activación y autorización para crear el tipo.