miércoles, octubre 24, 2007

Reflection falla al invocar miembros con el attribute ParamArray en Mono

Trabajando en un proyecto con Monorail, el cual estoy desarrollando desde OSX con Mono, el motor de vistas Brail fallaba al compilar una de las vistas, este problema se me presento solo con Mono, ya que en MS .NET la vista funcionaba como debia.

Investigando el problema, me di cuenta que Brail invoca por medio de reflection a los metodos que se indican dentro de la vista, y es precisamente aqui donde Brail fallaba al ejecutar; el metodo en cuestion era el metodo Create de la clase DictHelper dentro del Framework de Monorail, el cual se le pasan parametros de la forma: "property1=value", "property2=value", etc, y el metodo regresa un objeto del tipo IDictionary, este metodo acepta parametros de la forma: Create(params string args).

Params es una palabra clave de C# que permite definir un parametro especial que acepte una cntidad indefinida de parametos, por ejemplo Create esta definido come se mostro arriba, pero la forma en como lo puedo llamar es: DictHelper.Create("p1=v1", "p2=v2", "p3=v3"), es decir le paso un arreglo de parametros. .NET cuenta con un attributo ParamArray, el cual puede ser utilizado desde cualquier lenguaje, lo que sucede una vez que el programa ha sido compilado .NET toma los parametros y los convierte en un arreglo de parametros para que pueda ser pasado al metodo.

El problema de Mono es que no implementa funcionalidad para llamar mediante reflection metodos que usen la palabra clave params, pude haber creado un "bug" para reportar el problema a los desarrolladores de Mono y ya, pero al final me decidi a tratar de implementar el soporte para esta funcionalidad.

Despues de analizar como Mono invoca metodos por reflection, me fue necesario modificar los archivos Binder.cs y MonoType.cs.

El parche y programa de prueba lo envie a la lista de Mono-devel, de momento estoy a la espera de que lo revisen y me digan si lo aceptan o no.

2 comentarios:

Daniel Andrade Molina dijo...

hola me interesaria mucho saber como programas con mono en mac os x, es decir se que mono funciona en mac ( lo tengo instalado) pero como haces interfaces graficas?, intente con gtk# y simplemente no pude podrias darme alguna referencia?

Saludos, buen blog

Mario Alberto Chavez dijo...

Daniel;

No he desarrollado aplicaciones de escritorio aun en OSX, pero respecto a tu pregunta te puedo comentar que:

1.- Puedes desarrollar aplicaciones GTK# en OSX, pero necesitas tener instalado también el GTK+, el cual lo puedes instalar como se indica en esta pagina: http://www.mono-project.com/Mono:OSX
Ten en cuenta que las aplicaciones requerirán de tener instalado X11 en OSX y que no verán muy nativas que digamos.

2.- Puedes probar también con cocoa#, el cual parece que de momento no tiene mucha actividad, pero te permitirá crear aplicaciones con "look" nativo de OSX: http://www.cocoasharp.org/cocoaSharp/default.aspx/CocoaSharp/CocoaSharp.html http://www.osnews.com/story.php/8023/Cocoa-Sharp-is-Shaping-Up-First-Screenshots-Available/

3.- Puedes usar Windows.Forms, pero me parece que especialmente en OSX esta muy, pero muy atrás y no se que tan funcional sea, aunque hace unos días se anuncio en una de las listas de Mono, que se contrato gente para hacer que sea funcional.

Espero que esta información te sirva de algo.
Saludos