quarta-feira, 25 de agosto de 2010

Reflection

Do you wanna read in english?

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.


----

To whom has never heard about, Reflection is a feature in .Net which enables us to get information about an assembly in runtime(on the fly). So in runtime you can instance a DLL and extract information about namespaces, classes, methods and parameters. You can also run a specific method in runtime.

I needed to use this feature in a new project in my actual company, which one of the requirements was to invoke some methods in runtime.

While I was researching about Reflection I could see this feature is really useful in applications which allows to install plugins.

If u need any more information, please contact me.

----


/*Código Fonte / Source Code*/

//Estou montando os parametros que o método irá receber
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
///
/// Desenvolvido por: Diego Oliveira - 05/08/2010
/// Nome da DLL
/// Nome da Classe com namespace
/// Nome do Metodo
/// Objeto de parametro
/// Retorna o objeto de retorno do metodo
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;
}