SVN y versionado de soluciones Visual Studio
Cuando queremos versionar soluciones de Visual Studio, existen ciertos archivos que se deben incluir en el repositorio, y archivos que no. Si estamos usando Resharper, también vamos omitir los archivos que agrega a nuestras carpetas. La estructura de directorios que propongo es esta:

En este ejemplo para interactuar con el repositorio SVN, utilizaremos Tortoise SVN.
Consideremos una solución winApp, que tiene dependencias con la librería NHibernate.dll, que se encuentra en la carpeta lib. La solución en el Visual Studio luce así:
Los archivos de dicha solución serían los siguientes:
Una vez que tenemos nuestra solución creada, y nuestro repositorio funcionando, realizamos un checkout sobre una carpeta que elijamos, en mi caso es “D:\checkouts”. Ahí estaran los archivos que necesitan sincronizarse contra el repositorio. Luego del checkout, la carpeta seguirá vacia, pero lista para la sincronización.
Ahora copiamos nuestras carpetas “lib” y “winApp” dentro de “checkouts/” para agregarlas al versionado. Las seleccionamos y hacemos: TortoiseSVN -> Add…
Ahora tenemos que seleccionar los archivos que vamos a versionar. Dicho de manera contraria, eliminamos archivos que no deseamos que estén en el repositorio. Los archivos no versionables son:
- Carpeta bin/ y su contenido.
- Carpeta obj/ y su contenido.
- Carpeta _ReSharper.*/ y su contenido.
- Archivo *.resharper
- Archivo *.suo
Y la selección debe quedar similar a esto:
Una vez que agregamos los archivos, realicemos el commit !

Los archivos que no participan en el versionado son los desmarcados. Y luego el repositorio debería lucir así:
Listo, tenemos nuestras solución sincronizada y versionada !
Como tip final, podemos usar AnkhSVN, un plugin para Visual Studio que nos permite gestionar los comandos de SVN desde Visual Studio.
Linking assemblies
Linker, es una libreria que escribió Jb, y se encarga de reducir al mínimo el conjunto de funciones assemblies para que un conjunto de programas puedan correr. En otras palabras, toma las librerias que necesita un programa y elimina de ellas los métodos ó tipos que no son necesarios.
Pueden obtener el código del SVN, y compilarlo. Requiere Mono.Cecil.
Linker es una simple aplicación de consola, y toda la magia ocurre en una sola linea de comandos. Antes que nada, veamos que tenemos. Los archivos necesarios para que la aplicación Mono.Sms.exe funcionen son: Castle.Core.dll, Castle.Windsor.dll, Castle.MicroKernel.dll y Castle.DynamicProxy.dll. Ponemos todos archivos en el mismo directorio que el ejecutable Mono.Sms.exe. Luego ejecutamos:
monolinker -a Mono.Sms.exe -out linkedfiles/ -x descritor.xml
Donde indicamos cual va a ser la aplicación objetivo, el directorio de salida, y el archivo xml descritor con los tipos que se desean preservar despues del proceso de linkeo. Nuestro archivo con los tipos que no queremos que Linker los eliminie es el siguiente:
<?xml version="1.0" encoding="utf-8" ?> <linker> <assembly fullname="Castle.Windsor"> <namespace fullname="Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors"/> <type fullname="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler"/> </assembly> </linker>
Con esto indicamos que el namespace ElementProcessors, y el tipo CastleSectionHandler deben ser incluidos en la salida. Este descritor lo tuve que elaborar porque Linker omitia el tipo CastleSectionHandler, y tambíén eliminaba los constructores de los tipos contenidos en el namespace ElementProcessors. Como lo supe? Prueba y error.
Ahora veamos el resultado:
Ahora que hemos reducido, el tamaño de los assemblies, imaginense otra herramienta para juntar todos los assemblies en 1 sólo. La filosofía XCOPY de .Net, se convertiria en la COPY, nada más. Por estos caminos anda también Jb, que según dijo, está reescribiendo a monomerge (actualmente se cae).
Generando aplicaciones con AjGenesis
Este es el titulo del tutorial que nos deja Angel en su blog acerca de su querido AjGenesis.
Dos puntos que destaca Angel son:
- El modelo del que parte es totalmente definible por el usuario
- Las tareas y plantillas a aplicar son totalmente programables y controlables
Y de estos 2 puntos me quedo con el primero que me alcanza y sobra para decir cuan flexible es AjGenesis. Otras herramientas de generación de código muy útiles (vale la redundancia: todas las herramientas de generación de código son útiles) como MyGeneration, permiten la generación de código a partir de un modelo de datos. Esta es una gran diferencia con AjGenesis, esta permite la generación a partir de un modelo libre, no hay restricciones. El modelo lo podemos obtener desde una base de datos, a partir de nuestras clases, o podemos ir desarrollandolo de manera artesanal (a mano).
Compilando y Configurando Mono.Sms con NAnt en Ubuntu
Veamos como bajar y compilar Mono.Sms desde el código fuente en Ubuntu:
Para hacerlo debemos considerar tener un repositorio que contenga la version de Mono 1.2.4, con versiones anteriores no va a funcionar. Entonces hacemos:
$sudo apt-get install mono mono-gmcs mono subversion
$svn checkout http://monosms.googlecode.com/svn/trunk/ monosms
$cd monosms/
$nant
y con esto es suficiente para compilar Mono.Sms desde el SVN. Y para correrlo:
$cd build/
$mono Mono.Sms.exe
Previamente a lanzar la aplicación quizás querramos configurarla, para esto dentro de la sección monosms en el archivo Mono.Sms.exe.config se encuentran algunos parámetros:
<monosms> <settings> <add name="user.name" value="Jorge" /> <add name="user.email" value="usuario@monosms.com.ar" /> <add name="smtp.server" value="mail.gigared.com"/> </settings> </monosms>
Imágenes como recursos en los assemblies
Cuando trabajamos con Visual Studio/Sharpdevelop, podemos agregar en un pictureBox una imagen. Lo podemos hacer de 2 maneras (a simple vista): como Project Resource file ó Local Resource.
Ahora bien, otra manera de hacer esto, es añadiendo al proyecto las imágenes y declarándolas como Recursos Embebidos, para eso se podría crear una carpeta. Y después para obtener dichas imagenes utilizariamos un helper que nos retorne los recursos embebidos.
Así es como se está realizando el manejo de imágenes/iconos en Paint.Net. También copié el mismo esquema (y código) para Mono.Sms. Lo bueno del esquema que utiliza Paint.Net es que permite tener imágenes personalizadas dependiendo de la cultura:
Cuando Paint.Net necesita una imagen, lo solicita a la clase PdnResources, y esta hace lo siguiente:
- Verifica si posse una imagen personalizada según la Cultura, si encuentra la devuelve.
- Sino, busca dentro del assembly por imagenes embebidas, si encuentra la devuelve.
Al momento de buscar una imagen para asignarla a un pictureBox podemos hacer esto:
pictureBox.Image = PdnResources.GetImage("image.png");
El archivo PdnResources puede encontrarse aquí, y la manera que trata los recursos la considero como una buena práctica.
Mono.Sms contiene todas las imágenes embebidas de esta misma manera. Así se ven los recursos de Mono.Sms con Reflector:

Mono.Sms preview
Ya está para descargar Mono.Sms, hosteado como proyecto en Code Google.
Los binarios han sido probados en Mono 1.2.4/.Net Framework 2.0
Este es el trunk, pueden descargar el código fuente con un cliente de SVN como Tortoise SVNsi usan Windows.
Aquí están los binarios/setup para descargar:
Para dejar comentarios creé este grupo en google:
Voluntarios, envien los parches, reporte de issues/bugs aquí:
El código fuente se puede compilar usando NAnt. He incluido el archivo default.build en el SVN para este fin.
Iteraciones en C# – capturas de pantalla
En este post previo, hablábamos sobre las iteraciones en C# y donde dije que Mono me resultó un poco más rápido en Linux a diferencia con Mono en Windows y .Net Framework de MS. Bueno aquí les muestro las resultados de las ultimas corridas de cada uno para que vean. La clase con la que probé se encuentra aquí: Iteraciones.zip
Con .Net Framework de MS:
Con Mono en Windows:
Con Mono en Linux:
posts sobre DLR
Se viene DLR, que es el nuevo runtime para lenguajes dinámicos de Microsoft, y va a estar montado sobre el CLR. Esto va a tener muchas ventajas, ya que los lenguajes dinámicos como IronPython, Ruby.Net van poder conversar con lenguajes estáticos ya existentes como C# y VB.Net.
Si quieren saber más sobre DLR les aconsejo que se apunten a este feed.
- A Dynamic Language Runtime (DLR)
- First DLR talk video from MIX
- The One True Object (Part 1)
- The One True Object (Part 2)
Icaza talking about DLR and Silverlight
Formatear código para publicar en la web o blogs
Este enlace me lo debía desde hace tiempo. Con esta herramienta web podemos formatear el codigo C#, Vb, HTML o SQL a html para poder publicarlo en blogs o en nuestros sitios.
Solamente debemos copiar esto en la sección <head> de nuestro blog o site:
<link rel="stylesheet" type="text/css" href="csharp.css" >
El código de esta herramienta, que usa expresiones regulares está aquí.
Los métodos extendidos clarifican el código
Estuve jugando con los Métodos Extendidos en C# 3.0, y la verdad que esta feature hace que el código sea más legible.
string[] terminos = new string[] { "gurí", "guaina", "tereré", "mate" }; foreach (var item in terminos) Console.WriteLine(item);
Utilizando estas extensiones de métodos:
public delegate void VoidsHandler<T>(T param); public static class DarioExtend { public static void ApplyToAll<T>(this IList<T> lista, VoidsHandler<T> handler) { foreach (var item in lista) { handler(item); } } public static void WriteLine<T>(this IList<T> lista) { foreach (var item in lista) { Console.WriteLine(item); } } }
La forma de imprimir podría cambiarse por:
terminos.ApplyToAll(item => Console.WriteLine(item));
ó por esto:
terminos.WriteLine();