Reflexión y carga dinámica de clases

La reflexión y la carga dinámica de clases son dos herramientas muy eficaces de la arquitectura .NET. Este grado de personalización del programa en tiempo de ejecución impide que Dotfuscator determine de forma infalible si es seguro cambiar el nombre de todos los tipos cargados en un programa determinado.

Considere el siguiente fragmento de código (C#):

public object GetNewType() { 
   Type type = Type.GetType( GetUserInputString(), true ); 
   object newInstance = Activator.CreateInstance( type ); 
   return newInstance; 
} 

Este código carga un tipo por nombre y crea dinámicamente una instancia del mismo. Además, el nombre proviene de una cadena introducida por el usuario. (O por una base de datos en tiempo de ejecución, otro programa, etc.)

Evidentemente, no hay manera de que Dotfuscator prediga qué nombres de tipos introducirá el usuario. La solución es excluir los nombres de todos los tipos que posiblemente se pueden cargar (observe que aún se puede cambiar los nombres de los métodos y campos). Aquí es donde la configuración manual del usuario (y algún conocimiento de la aplicación que se va a ofuscar) desempeña un papel importante.

Normalmente, la situación es menos grave. Consideremos una pequeña variación:

public MyInterface GetNewType() { 
   Type type = Type.GetType( GetUserInputString(), true ); 
   object newInstance = Activator.CreateInstance( type ); 
   return newInstance as MyInterface; 
} 

Ahora resulta evidente que sólo es necesario excluir un subconjunto de tipos: los que implementan MyInterface.

© 2002-2007 PreEmptive Solutions. Reservados todos los derechos.