jueves, 19 de julio de 2012

Cómo convertir una solución o proyecto de C# a VB.NET automáticamente

Muchas páginas permiten pasar pedazos de código de VB.Net a C# y viceversa, pero cuando uno tiene un proyecto o solución grande, utilizar éstas páginas para convertir de lenguaje suele ser tedioso y lento. Por eso para pasar una solución completa tuve que ponerme a buscar una mejor opción....
Luego de buscar bastante por internet encontré una mejor forma de hacerlo.
Para poder hacerlo hay que bajar un interesante programa de internet que se llama SharpDevelop (al momento de escribir este artículo en su version 4.2).

SharpDevelop es un interesane IDE de desarrollo en tecnología .NET el cual es gratuito y open-source, dispone de varios lenguajes para desarrollar (C#, VB.NET, C++, F#, Python, Ruby y algunas cosas más)... Es verdaderamente muy liviano y anda muy rápido, aunque lo utilicé poco le encontre un solo defecto importante: no permite, al estar haciendo debug modificar el código y seguir debuguiando (a no ser que reinicie el debug), esto se debe a que (según leí en sus foros) el compilador .NET de Microsoft no tiene abierta la posibilidad de hacer esto (se me ocurre que así Microsoft se asegura que nadie pueda hacer un IDE mejor, o que le pueda competir al Visual Studio)...

Bueno, el tema es que este IDE, entre otras funcionalidades tiene la de convertir Proyectos enteros de un lenguaje a otro de los que tiene para desarrollar. :-)

Por ejemplo para pasar de C# a .NET mi proyecto hago lo siguiente, abro mi solución con SharpDevelop y en la solapa projects selecciono el proyecto a convertir y con botón derecho->Convert->From C# to VB.NET lo convierto y me deja una copia convertida del proyecto con el mismo nombre pero agregando .Converted... GENIAL!!!

Deja algún que otro pequeño error o advertencia, pero no muchas y fáciles de solucionar. Lo único que tardé un poco en darme cuenta fue que deja los Resources en
Global.<nombre proyecto>.Properties.Resources.<recurso>

cuando debería dejarlos en
Global.<nombre proyecto>.Resources.<recurso>

O sea sin el properties... 
También que a algunos controles se "olvida" de ponerles el WithEvents cuando tienen eventos...
En algunas páginas deja los "Option Strict On" "Option Explicit On" sin estar exactamente al principio, lo cual genera algunos errores.
... Fuera de eso y alguna que otra advertencia ¡Compilo y anda!

jueves, 12 de julio de 2012

Cómo convertir una solución de Visual Studio 2010 a 2008

Convertir una vieja solución de VS 2008 a VS 2010 es bastante fácil, se convierte automáticamente al abrirla con el nuevo VS, pero volver de uno en 2010 a ponerlo en 2008 no es tan simple (aunque tampoco es muy complicado).
E aquí los pasos a seguir...
  1. Abra en el notepad, o en el programa de edición de texto que más le guste, en mi caso el NotePad++ (np++ http://notepad-plus-plus.org/) el archivo de la solución (el que termina en .sln).
  2.  Busque la línea que dice "Microsoft Visual Studio Solution File, Format Version 11.00" y reemplace por "Microsoft Visual Studio Solution File, Format Version 10.00" (o sea, cambie la versión de 11 a 10.
  3. Busque la línea que dice "# Visual Studio 2010" y ponga "# Visual Studio 2008" (o sea, cambie 2010 por 2008.
  4. Busque con el explorador de windows y abra la carpeta "obj\x86\Debug" (se encuentra dentro de la carpeta de su proyecto), allí debe eliminar los archivo terminados en .chache.
  5. También busque y elimine los archivos .cache en la carpeta "obj\x86\Release"
  6. ¡Listo! ya puede abrir su solución en VS 2008.
 Espero les sirva de ayuda :-).

Problemas que surgieron en algunos proyectos usando este método y como solucionarlos...
Tiro un mensaje 'Container' is ambiguous in the namespace 'System.ComponentModel': lo solucione quitando la referencia a System dentro de Referencias y luego agregándola nuevamente. (!?)





miércoles, 11 de julio de 2012

Obtener la posicion de un control respecto al parentform

Bueno, aquí un breve código que utilicé para obtener la posición de un control WinForm con respecto a su ParentForm, es útil si se quieren poner controles dinámicamente dentro de un formulario y cambiar su posición (por ejemplo posicionándolo al lado de otro control)... con c# .Net



using System.Drawing;
using System.Windows.Forms;

...

public   class UserControlGeneral : UserControl
    {
        /// <summary>
        /// Busca el Point donde está ubicado el control respecto del ParentForm
        /// </summary>
        /// <returns>Point</returns>
        protected Point buscarLocationRespectoParentForm()
        {
            return buscarLocationRespectoParentForm(this);
        }

        /// <summary>
        /// Busca el Point donde está ubicado el control que recibe de parámetro respecto del ParentForm
        /// </summary>
        /// <param name="control">Control al que se le quiere encontrar la posición</param>
        /// <returns>Point</returns>
        protected Point buscarLocationRespectoParentForm(Control control)
        {
            if (control.Parent == this.ParentForm)
            {
                return new Point(control.Location.X, control.Location.Y);
            }
            else
            {
                Point p = buscarLocationRespectoParentForm(control.Parent);
                p.X += control.Location.X;
                p.Y += control.Location.Y;
                return p;
            }
        }
    }