Nuevas descargas para Visual Studio 2008 Team System

Pues sí, parece que acompañando a la versión RTM, los chicos de Microsoft, van a sacar otras cuantas cosillas que son bastante útiles en muy poquito tiempo.

Lo primero, que saldrá la semana que viene, y que a mi me agrada especialmente, es la release de Team System Web Access compatible con TFS 2008, ya habían sacado una CTP (que yo he probado y va bastante bien, al menos en las demos), y ahora sacan ya la final, esta es una herramienta que sinceramente recomiendo a todo el mundo que tenga un TFS, nos permite acceder a todas las partes nuestros proyectos desde un interfaz web muy cómodo.

Y lo siguiente, para mediados de diciembre:

  • Proveedor MSSCCI, que nos proporciona un entorno de acceso a TFS 2008 desde clientes VS 2003, VB 6, y algún que otro IDE
  • Power Tools: siiiii una nueva versión de las Power Tools, que incluyen:
    • Build notification tray, Una herramienta de «system tray» para monitorizar las builds del TFS 2008.

brokennotification

    • Una nueva versión del Process Template Editor, que saldrá en el menú de «Tools»  (antes es cierto que estaba pelín escondida), mejoras de rendimiento y bugs.
    • Best Practices Analyzer, una herramienta que nos permitirá «analizar» nuestro entorno TFS, y diagnosticar problemas con nuestro TFS 2008 (esta es un must-have)
    • Work Items y Work Items Type destroy, algo que mucha gente ha pedido, y aunque es un poco discutible su «utilidad» han añadido en las power tools, y es que mediante la línea de comandos tfpt, podremos destruir (si, si borrar totalmente) tanto Work Items como tipos de Work Items. Por cierto, esto ya está soportado a nivel de servidor y modelo de objetos, pero con esto lo podremos hacer por línea de comandos.

Fuente: Upcoming Power Tool Release for TFS 2008

Chat con el equipo de producto de Visual Studio Team System

simplemente un anuncio, que ahora que está recientito el VS 2008 os puede interesar. El 5 de diciembre de 19:00 1 20:00 (hora española), habrá un chat con el equipo de producto de VSTS para hablar acerca de las nuevas funcionalidades y de la versión 2008 en general, yo, si puedo hacer un hueco me veréis por allí.

También se repite ese mismo día de 1:00 a 2:00 de la madrugada, hora española también, aunque esas horas son más intempestivas.

Para entrar en los chats aquí os paso los links:

Podéis ver más detalles de este chat y de otros en: http://msdn2.microsoft.com/es-es/chats/default.aspx

Escribiendo Custom Actions en C# para WiX (o jugando con MSIL)

Últimamente no paro, entre eventos y proyecto de domótica no me queda mucho tiempo, pero hoy que tengo un ratio, os voy a comentar algo interesante que me he encontrado recientemente.

Como muchos sabréis, los proyectos de Setup de Visual Studio están bien para cuestiones sencillas, pero en cuanto tenemos que irnos a algo un poco más complicado, ya tenemos que usar o bien herramientas de terceros, o bien aprovecharnos de WiX para sacar toda la potencia de Windows Installer. WiX para los que no lo conozcáis, es un proyecto de SourceForge, que mediante ficheros Xml, nos permite generar paquetes de instalación de Windows Installer, a primera vista parece muy sencillo, pero la realidad es que no lo es :), además tampoco podemos decir que haya mucha y detallada documentación de WiX, aparte de un excelente tutorial, pero que está basado en la versión 2.0 (yo estoy con la 3.0).

Pues bien, el problema que se me planteaba, era que las custom actions que se pueden hacer en WiX, puesto que se ejecutan mediante Windows Installer, tienen que ser en DLLs nativas, si podemos usar un proyecto de consola manejado, para lanzar un Exe, pero perdemos gran parte de la potencia de integración, por tanto, el medio era hacer una DLL nativa, pero ups, problema, tenía que llamar a un servicio WCF, entre otras cosas, por lo que lo más «cómodo» era hacerlo en C#.

Buscando buscando, encontré un artículo en C# Corner, acerca de como exportar un método de una clase manejada, para ser usado desde código no manejado (no COM+ ojo).

La cosa es «sencilla», aunque tendremos que modificar el MSIL, y recompilarlo, supongamos que tenemos una clase como esta:

using System;

namespace MisAccionesWiX
{
    public class MiPrimeraAccion
    {
        public static int Accion( IntPtr handle )
        {
            //Nuestro código
            return 0; //Si todo OK devolvemos 0, si queremos hacer fallar la instalación para causar un Rollback devolvemos 1
        }
    }
}

Es importante que el dato de entrada sea un IntPtr, ya que si queremos llamar a funciones de la API de Msi, como «MSiGetProperty» necesitaremos este handle.

Esto lo creamos y lo compilamos en un ensamblado de clase totalmente normal, y ahora viene la «magia», abrimos una ventana de línea de comandos de Visual Studio, y ejecutamos, en el directorio donde tenemos la Dll compilada (suponiendo que nuestra Dll se llame MisAccionesWiX):

ildasm /OUT:MisAccionesWiX.il MisAccionesWiX.dll

con esto se nos genera el fichero MisAccionesWiX.il, que tiene el precioso código MSIL, lo primero que tenemos que decirle al ensamblado es que no sólo se va a ejecutar desde código manejado, para esto buscamos esta línea:

.corflags 0x00000001    //  ILONLY

Como véis, el comentario es bastante claro, lo único que tenemos que hacer es cambiarla por «.corflags 0x00000002», cambiando este flag, ya le estamos diciendo que esta Dll se va a poder cargar desde un proceso no manejado (en este caso Windows Installer).

A continuación lo que vamos a hacer es exponer nuestro método para código no manejado, para esto (ver el artículo para más detalle), vamos a crear una entrada en la «v-Table fixup» del assembly, y luego crear una entrada para guardar la dirección virtual de nuestro método, lo cierto es que tampoco puedo entrar mucho en detalle aquí, ya que mis conocimientos de MSIL y CLR no llegan a tanta profundidad como me gustaría y como deberían :(.

Para hacer esto, simplemente a continuación del flag que hemos modificado agregamos estas líneas:

// Creamos la entrada en la VTable
.vtfixup [1] int32 fromunmanaged at VT_01

// Creamos la entrada para la dirección de nuestra función
.data VT_01 = int32(0)

Una vez que tengamos hecho esto, simplemente, y poco más abajo, localizamos nuestro método, en el código MSIL sería similar a esto:

.method public hidebysig static int32  Accion(native int handle) cil managed
{

….

}

Aquí, vamos a especificar que entrada VTable vamos a usar para esta función y exportar el método para código no manejado, para esto, las primeras líneas de nuestro método serán:

.method public hidebysig static int32  Accion(native int handle) cil managed
{

// Aquí damos la entrada de la VTable
.vtentry 1 : 1
//Aqui exportamos el método para código no manejado con el alias «Accion»
.export [1] as Accion

}

 

Bueno, ya casi estamos :), ahora vamos a recompilar el MSIL, para esto, y desde la línea de comandos de Visual Studio, ejecutamos:

ilasm /OUT:MisAccionesWiXNoManejado.dll MisAccionesWiX.il /DLL

Esto (si todo lo hemos hecho bien) nos generará la Dll «MisAccionesWiXNoManejado.dll» que podremos usar en nuestra Custom Action de WiX, para usarla, igual que usamos cualquier otra Dll en WiX pondremos (suponiendo que tenemos la Dll en el mismo directorio que el fichero Wxs):

<!– Referenciamos el Binario –>

<Binary Id=»MiCADll» SourceFile=»MisAccionesWiXNoManejado.dll» />

<!– Definimos la custom action –>

<CustomAction Id=»MiCAID» BinaryKey=»MiCADll» DllEntry=»Accion»/>

Y ya, en la sección de secuencia de installación, la llamamos como a cualquier otra CA.

Fácil ¿no?

Por cierto, como ya he dicho, no conozco tanto como debería y me gustaría del CLR, pero bueno, es algo que voy resolviendo poco a poco cuando tengo tiempo 🙁

No voy al TechEd, pero si alguno va al SIMO …

Pues sí, este año no puedo ir al TechEd :(, aunque me gustaría, entre otras cosas por ver a mucha gente que no veo normalmente, pero este año no puedo, entre eventos que tengo que dar, otros en los que he estado, y sobre todo, como algunos de vosotros ya sabéis estoy colaborando desde hace poco con un antiguo compañero en un producto de domótica, pues si, tenía ganas de saber como es la creación de un producto, y mejor compañía que esta no iba a encontrar para hacerlo 🙂 así que me apunté, y aquí estoy, «fabricando» Multidomo.

La cosa es, para los quedáis en Madrid, si vais al SIMO, el miércoles, en el auditorium que tiene Microsoft para presentar productos basados en su tecnología, haremos una demo del producto, Multidomo, algunos de vosotros ya lo habéis visto en mi móvil, con este producto podéis, ver cámaras, encender luces, subir/bajar persianas, etc… la verdad es que esto sólo es la punta del iceberg, hay cosas mucho más interesantes (estados, programas, …).

Y como lo mejor es que lo veais, aquí os dejo el enlace dónde podéis ver las características: http://www.multidomo.com y también podéis acceder a una casa REAL logoMultidomo(el enlace de la casa piloto), e interactuar con ella, ver cámaras, encender luces, etc… Aunque ahí sólo podréis ver el interfaz web, pero también tenemos interfaz para móvil (basados en Windows Mobile), para PDA y para Media Center. En fin, que ya hay muchas cosas hechas, y muchas que quedan por hacer :). Así que si alguien está interesado, pues nada el miércoles a las 11:00 os quiero ver por el stand de Microsoft, por supuesto si alguno estáis aún más interesados os podéis bajar la beta (con que tengáis una webcam para ver ya podéis usarlo), y trastear con ella, o me preguntáis lo que queráis por aquí.

Por supuesto algunos detalles son, que estamos usando AJAX.NET masivamente, WCF, Silverlight 1.0, Media Center para Vista con MCML, y todos esas cositas que nos gustan tanto a todos 🙂

Lo dicho, que los que os vais al TechEd espero que os lo paséis muy bien, y los que no y seais de Madrid, a ver si os veo por el SIMO.