Mi primer encuentro con Roslyn

En el proyecto en el que estoy trabajando se me presento una necesidad que ya no me parece tan extraña, consistía en crear un ensamblado en tiempo de ejecución y esperar una respuesta de un método de una de sus clases, nada extraño, entonces pensé en Microsoft.CSharp, System.CodeDom y Reflection… justo aquí fue donde me acorde de haber oído hablar de Roslyn, de sus capacidades para crear arboles sintácticos y flexibilidad en la compilación de estos. Entonces abrí varios enlaces y me dedique a ver de qué se trataba realmente esto.

El concepto básico que encontré para definir a Roslyn, es que siempre hemos visto a los compiladores como cajas negras a la que nosotros damos un código fuente y esta nos devuelve un ensamblado o un ejecutable. Roslyn lo que busca es abrir esta caja negra y permitirnos a nosotros como desarrolladores obtener el modelado interno del lenguaje, arboles de sintaxis y demás. Roslyn convierte al compilador en APIs de servicio, que podemos emplear por independiente para extender las funcionalidades que queramos.

Roslyn Expone entonces un conjunto de 4 APIs, de estas intentare hablar en futuras entradas.

Lo que hice en el proyecto en el que comente al inicio de la entrada fue agregar las referencias a Roslyn desde el manejador de paquetes de Nuget y empezar a trabajar con estos árboles de expresión, me pareció tan sencillo y útil que merece más entadas y estudio, les dejo a manera de ejemplo un pequeño ejercicio para ver su estructura:

        static void Main(string[] args)
        {
            const string codigo = @"class Calculadora 
                                    { 
                                        public static int Sumar(int num1, int num2) 
                                        { 
                                            return num1 + num2; 
                                        } 
                                    }"; 

            var arbol = SyntaxTree.ParseCompilationUnit(codigo);
            var compilation = Compilation.Create(
                "MiCalculadora.dll",
                options: new CompilationOptions(assemblyKind: AssemblyKind.DynamicallyLinkedLibrary),
                syntaxTrees: new[] { arbol },
                references: new[] { new AssemblyFileReference(typeof(object).Assembly.Location) });

            Assembly asembli;
            using (var stream = new MemoryStream())
            {
                EmitResult resultadoCompilacion = compilation.Emit(stream);
                asembli = Assembly.Load(stream.GetBuffer());
            }

            Type calculadora = asembli.GetType("Calculadora");
            MethodInfo metodo = calculadora.GetMethod("Sumar");
            string resultado = metodo.Invoke(metodo, new object[]{5,5}).ToString();
            Console.WriteLine(resultado);
            Console.ReadKey();
        }

El resultado de la ejecución de este código dará como resultado:

Conclusión:

Sin duda alguna es un gran proyecto y una gran oportunidad no solo de escribir si no de entender mejor lo que hace y hará nuestro código por detrás, controlando aspectos que antes era imposible controlar. Espero documentar en mi blog todas mis experiencias con este CTP

Hasta el próximo post.

Anuncios
Mi primer encuentro con Roslyn

2 comentarios en “Mi primer encuentro con Roslyn

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s