Para quem nunca ouviu falar Reflection é um mecanismo do .Net que nos permite obter informações de assemblies em runtime(on the fly), ou seja, você consegue instanciar uma Dll em tempo de execução e extrair informações de namespaces, classes, métodos e parâmetros. Também é possível executar métodos em tempo de execução.
Precisei utilizar esse mecanismo em um novo projeto da minha empresa atual que tinha o requisito de executar métodos de uma determinada DLL em tempo de execução.
Durante minhas pesquisas verifiquei também que esse mecanismo é muito utilizado em aplicações que tem instalações de plugin.
/*Código Fonte / Source Code*/
object[] myparam = new object[6];
myparam[0] = 90;
myparam[1] = 2;
myparam[2] = @"C:\teste\1.xml";
myparam[3] = @"C:\teste";
myparam[4] = true;
myparam[5] = true;
//Estou chamando o método que ira abrir a DLL em tempo de execução
LoadDll("c:\minhadll.dll", "Namespace.Classe", "Metodo", myparam);
///
/// Abre a dll dinamicamente
///
///
/// Nome da DLL
/// Nome da Classe com namespace
/// Nome do Metodo
/// Objeto de parametro
///
public static object LoadDll(string strAssemblyName, string strClassName, string strMethodName, object[] objParametros)
{
object returnObject = null;
MethodInfo miMethod = null;
ConstructorInfo ciConstructor = null;
object objResponder = null;
Type tpType = null;
System.Type[] objectTypes;
int intCount = 0;
try
{
//Abre a dll
tpType = System.Reflection.Assembly.LoadFrom(strAssemblyName).GetType(strClassName);
//Pega os parametros passados para identificar o metodo
objectTypes = new System.Type[objParametros.GetUpperBound(0) + 1];
foreach (object objectParameter in objParametros)
{
if (objectParameter != null)
objectTypes[intCount] = objectParameter.GetType();
intCount++;
}
//Referencia o metodo
miMethod = tpType.GetMethod(strMethodName, objectTypes);
ciConstructor = tpType.GetConstructor(Type.EmptyTypes);
objResponder = ciConstructor.Invoke(null);
//Executa o metodo
returnObject = miMethod.Invoke(objResponder, objParametros);
}
catch (Exception ex)
{
throw ex;
}
finally
{
miMethod = null;
ciConstructor = null;
objResponder = null;
tpType = null;
objectTypes = null;
}
return returnObject;
}