jueves, 22 de noviembre de 2012

Visual Studio no lanza todas las excepciones del código

Hoy me ha pasado una cosa un poco extraña relacionada con la gestión de excepciones.

El problema

Tenemos un formulario de Windows con una caja de texto en la que en el evento “TextChanged” realizamos una serie de operaciones, llamando para ello a un método externo.

El tema es que en un momento dado, me he fijado que en el método externo se estaba produciendo una excepción, pero en depuración no me estaba mostrando la típica ventana de excepción no controlada… Vamos, que no me estaba enterando de que había un problema con el código.

Para reproducir este comportamiento, basta con añadir una caja de texto a un formulario y codificar en el manejador del evento “TextChanged” una llamada a una función que produzca una excepción, por ejemplo:

image

Ejecutamos el formulario y escribimos algo en la caja de texto.

¿Aparece esta ventana?

image

Entonces no tienes el mismo problema que yo y te has equivocado de post…

Lo que a mí me pasaba, es… nada. No da ningún tipo de excepción al trabajar con el formulario en cuestión. entonces, ¿cómo sabemos que hay una excepción? en la ventana de “Output” aparece la siguiente entrada:

image

Una explicación (rapidita)

Por lo visto, este comportamiento es así por diseño, siempre que estemos ejecutando Visual Studio en un sistema en 64 Bits (como es mi caso) cuando la excepción se produce en un método que cause una transición al kernel (como por ejemplo el manejador en cuestión, esta excepción se trata en el propio kernel y se atrapa por el sistema operativo. Como la excepción ya ha sido controlada, lo que sucede es que nosotros no nos enteramos.

Para más detalle, entiendo que Google estará encantado de ayudarnos.

Una solución (más bien alternativa)

Para conseguir que el depurador de Visual Studio nos avise de esas excepciones, tenemos que indicarle explícitamente, en la ventana de “Exceptions”

image

Esta ventana aparece en el menú “Debug”, “Exceptions…” y para evitar el comportamiento que he explicado, basta con marcar la casilla “Thrown” del grupo “Common Language Runtime Exceptions”

Una vez marcada la casilla, cuando llega al punto de la excepción, ya nos aparece la ventana de excepción no controlada que necesitamos. De esta manera ya no se nos “enmascaran” posibles errores…

¿Por qué digo que es una alternativa?

Un efecto colateral de esta configuración es que a partir de activar la opción, cada vez que de una excepción (sea controlada o no) nos va a aparecer la dichosa ventanita, deteniendo el depurador hasta que le demos a continuar.

Esto en condiciones normales es un auténtico problema, pero yo considero que me merece la pena el inconveniente, sobre todo si trabajamos con ‘rethrowing’

Último apunte

El problema expuesto aquí no genera ningún problema adicional en el código desarrollado, ya que si en lugar de arrancar el depurador ejecutamos el archivo compilado o lanzamos la ejecución SIN depuración (Ctrl + F5) la excepción no controlada SÍ que aparece aunque, claro, con la apariencia que nadie queremos en nuestros programas

image

martes, 6 de noviembre de 2012

Trabajando con NuGet–Un inicio

¿Qué es NuGet?

NuGet es una extensión de Visual Studio que hace que sea fácil agregar, actualizar y elimina bibliotecas (implementadas como paquetes) en un proyecto de Visual Studio. Un paquete de NuGet es un conjunto de archivos empaquetados en un solo archivo con extensión .nupkg que usa el formato Convenciones de empaquetado abierto (OPC).

(Copiado íntegramente del MSDN)

¿Qué hace falta?

Lo primero, instalarlo.

En Visual Studio 2010 se instala mediante el administrador de extensiones (Menú Tools, Extension Manager) mientras que Visual Studio 2012 lo trae instalado por defecto.

Una vez instalado, basta utilizar los nuevos menús (Manage NuGet Packages)

Esta herramienta es brutal, pero lo verdaderamente brutal sería poder crear nuestro propio repositorio de paquetes de NuGet, de forma que en la organización tuviéramos todos los componentes homologados disponibles para su utilización, actualizables además muy fácilmente.

En el artículo indicado anteriormente tenemos las instrucciones básicas, que a continuación intentaré explicar un poco más si es necesario.

Generar un servidor NuGet

No es necesario generar un servidor de NuGet para poder trabajar con un repositorio particular de paquetes, pero considero que es importante y útil como para al menos indicarlo.

Sencillo:

  1. Creamos una aplicación web ASP.NET (4.0) vacía en Visual Studio.
  2. Instalamos el paquete de NuGet “NuGet.Server”
  3. Publicamos la aplicación en un servidor web.
  4. Publicamos en la carpeta “Packages” los paquetes de NuGet que queramos que estén disponibles.

Añadir una ruta de paquetes en Visual Studio

Para configurar Visual Studio de forma que pueda conectar al repositorio, tenemos que ir a Herramientas, Opciones, y añadir un nuevo origen de paquetes en la ventana:

image

Generar un paquete de NuGet

Para generar nuestros propios paquetes para NuGet, podemos hacerlo mediante línea de comandos (descargando nuget.exe) o podemos hacerlo con un interfaz gráfico (descargando el “NuGet Package Explorer”) se trata de una aplicación click-once, con lo que se actualizará automáticamente.

A continuación vamos a ver los pasos necesarios para generar un paquete con el cliente click-once.

  1. Arrancamos el “NuGet Package Explorer”
  2. Elegimos la opción “Create a new package”
    image
  3. En la parte de la izquierda editamos los metadatos del paquete (Menú Edit, Metadata)
  4. En la parte de la derecha arrastramos en ensamblado que queremos empaquetar.
    image
  5. Guardamos el paquete en la ruta deseada con el menú File, Save o podemos exportarlo con el menú File, Export…

En el momento de generar el paquete podemos además indicar las dependencias que nuestro paquete tenga con otros componentes. Para añadir una dependencia, hacemos clic en el botón “Edit dependencies” en la parte inferior de la sección izquierda (donde hemos puesto la información del paquete)

  1. Añadimos un nuevo grupo con el botón con el símbolo “más”
    image
  2. Ahora hacemos clic en el botón con el icono de propiedades para elegir una dependencia alojada en un repositorio, y la seleccionamos con doble clic (en la siguiente captura, seleccionamos el paquete de log4net)
    image
  3. Confirmamos haciendo clic en el botón de añadir nueva dependencia (a la derecha de la caja con la versión del componente)
    image
  4. Confirmamos con “OK” y ya tenemos la dependencia creada.

Al añadir una dependencia, lo que conseguimos es que cada vez que se instale el paquete, automáticamente se instalen también las dependencias configuradas.

Otra opción interesante es hacer ‘transformaciones’. Esto significa que podemos configurar el paquete para que actualice archivos presentes en el proyecto, por ejemplo el archivo App.config.

Para esto, en la sección de “Package contents”

  1. Añadimos la carpeta para contenido (menú Content, Add, Content Folder)
    image
  2. Sobre la carpeta “content” añadimos un nuevo archivo con el botón derecho del ratón y, muy importante, le damos al archivo el nombre del archivo que queremos modificar, terminado en “.transform”
    image
  3. Esto genera un archivo vacío, en el que incluiremos el contenido que deseamos que se añada al configurar el paquete en el proyecto, en la siguiente captura se puede ver el contenido necesario para el correcto funcionamiento del paquete ‘log4net’
    image

Una vez hecho todo esto, cuando configuremos el proyecto para utilizar el paquete, automáticamente añadirá las entradas especificadas en el archivo de configuración.

Actualizar un paquete de NuGet

Realmente no existe el concepto como tal de actualizar, realmente lo que hacemos es un “Save as” del paquete anterior, modificando la versión en la sección de “Package Metadata”. Al hacer el “Save as” nos propone el nombre original actualizado con la nueva versión, y una vez en la solución, si hacemos clic con el botón derecho del ratón sobre la solución y elegimos “Manage NuGet Packages for Solution” veremos que tenemos nueva versión del paquete, y podremos actualizar todos los proyectos de la solución de un plumazo.

image

image

Ultimas consideraciones

Existen más posibilidades al generar paquetes, como por ejemplo publicar distintas versiones de los ensamblados para distintas versiones del Framework, pero de momento no vamos a entrar más a fondo, como primera aproximación es suficiente.

miércoles, 17 de octubre de 2012

Pruebas de software–Recursos

Un listado rápido de presentaciones acerca de las pruebas de software, un poco más de información aparte de la clásica de caja blanca / negra, de humo, etc. Todas en castellano y disponibles libremente en ‘www.slideshare.net

  • Tipos de pruebas de software: 32 transparencias detallando de forma muy clara un gran número de tipos de pruebas, desde las unitarias hasta las pruebas beta. Acceso.
  • Introducción a las pruebas de software: Fundamentos, metodología y tipos de pruebas a lo largo de 57 transparencias, incluida bibliografía y sitios de consulta. Acceso.
  • Fundamentos de pruebas: Muy completa, tratando los fundamentos de las pruebas, pruebas a través del ciclo de vida del software, técnicas estáticas y el proceso del software, técnicas de diseño de pruebas y gestión de pruebas, todo ello a través de 119 transparencias. Acceso.

 

Si encuentro algo más interesante a nivel teórico, iré actualizando la lista, y como he comentado en alguna ocasión, si alguien entiende que estos enlaces no deben estar publicados aquí, no tiene más que dejar un enlace y tomaré las medidas adecuadas.

martes, 25 de septiembre de 2012

Cómo hacer funcionar un servidor de compilación de TFS 2010

Sin morir en el intento

Situación inicial

Pongamos que tenemos una instalación nueva, limpia, de un sistema TFS 2010, con su servidor de Base de Datos, su servidor de TFS 2010, y ahora queremos instalar una máquina para las compilaciones.

Sin problemas ¿no? instalamos la parte del servicio de Builds desde el DVD de TFS 2010 y listo (bueno, listo no, primero lo tenemos que enganchar al servidor de TFS, pero hasta aquí es tal y como pone en toda la documentación de Microsoft)

El problema

Una vez instalado y configurado, generamos una nueva definición de Build, así como lo hemos hecho siempre, sin nada especial, y la lanzamos. El resultado:

image

Otro que nos puede también aparecer (este relacionado con la compilación en 32 ó 64 bits):

image

Y por supuesto alguno más, como el mensaje del “Tracker.exe” del que ya hablé aquí.

[modo enfado ON]

Puedo entender que cuando montamos un sistema de compilación existan determinados tipos de proyectos que de partida no podamos compilar sin alguna configuración ‘especial’ (por ejemplo los de Sharepoint) o que si el proyecto utiliza componentes de terceros haya que realizar alguna operación especial, pero ¿cómo es posible que no sea capaz de compilar un mini proyecto de prueba sin nada especial?

O por lo menos, en la documentación que lo avisen: “Instalar únicamente el servidor de Compilaciones NO permite compilar proyectos”.

[modo enfado OFF]

En fin, es lo que hay. ¿cómo lo solucionamos?

La solución

El mensaje de error de la compilación nos da varias opciones para solucionar el problema (en este caso el del “resgen.exe”)

  1. Install the Microsoft Windows SDK. 
  2. Install Visual Studio 2010. 
  3. Manually set the above registry key to the correct location. 
  4. Pass the correct location into the "ToolPath" parameter of the task.

Vamos a ver, si es obligatorio tener instalado algún SDK o el Visual Studio, ¿por qué no lo dicen en ningún sitio? Que no lo digo por no instalar, lo digo por la cara de tonto que se te queda…

En mi caso, lo que mejor me venía era instalar el SDK de Windows, en concreto “Microsoft Windows SDK for Windows 7 and .NET Framework 4

Una vez instalado, ya compila correctamente.

Nota mental

Es muy posible que al intentar compilar un proyecto web aparezca el siguiente mensaje:

image

Esto es porque no hemos instalado el Visual Studio 2010, para solucionarlo sin necesidad de instalar este producto, basta con instalar el Team Explorer en el servidor de Compilación.

De hecho, en muchas páginas que he consultado para estos problemas recomiendan instalar Visual Studio en la máquina de compilación, que además no consume licencia… Igual es lo más fácil.

jueves, 20 de septiembre de 2012

Error al publicar una aplicación mediante ClickOnce con Visual Studio 2010

Una rápida, que me acaba de pasar y que si no lo apunto, la siguiente vez que me pase lo mismo estoy todo el día mirando por qué.

El problema

Abrimos una solución con Visual Studio 2010, vamos a las propiedades del proyecto que queremos publicar mediante ClickOnce, y le damos al botón “Publish” (o al “Publish Wizard”, realmente sucede lo mismo); resultado de la publicación:

image

¿Cómo?

A ver. Compilamos la solución y compila bien, volvemos a compilar todos los componentes y compilan bien, intentamos hacer la compilación y… el mismo error.

La solución

Voy a ir directamente a la solución, ya que no tengo explicación para este comportamiento:

1.- En el Solution Explorer, localizamos el proyecto.

2.- Sobre el proyecto, clic con el botón derecho del ratón, “Publish”

image

¿El resultado?

image

Que alguien me lo explique, por favor.

miércoles, 18 de julio de 2012

Cómo cambiar el icono de las bibliotecas de Windows 7

Un pequeño truquito para las vacaciones.

Objetivo

Lo que queremos es personalizar cómo se ven las bibliotecas en Windows 7:

image

Al turrón

Desafortunadamente, Windows no trae ningún interfaz gráfico para personalizar la visualización de las Bibliotecas (hasta donde yo recuerdo, claro). Afortunadamente, no es especialmente complicado.

  1. Abrimos un explorador de Windows y en la barra de direcciones ponemos la ruta “%AppData%\Microsoft\Windows\Libraries”
  2. Vemos que accedemos a la carpeta de las bibliotecas, pero con un formato un poco diferente:
    image
  3. Abrimos un Bloc de Notas y arrastramos (sí sí, arrastramos) el icono correspondiente a la carpeta a la que queremos modificar el icono. Como veremos se abre un archivo XML de configuración:
    image
  4. Para especificar que queremos que la biblioteca se muestre con un icono personalizado, lo único que haremos será copiar el icono deseado a esta carpeta (realmente es suficiente con que siempre esté en la misma ruta) y en el archivo que hemos abierto añadimos la siguiente entrada, justo encima de “<templateInfo>:
    <iconReference>C:\Users\XXX\AppData\Roaming\Microsoft\Windows\Libraries\NombreArchivoIcono.ico</iconReference>
  5. Cerramos el archivo guardando y… Listo!

Por supuesto, antes de hacer ningún cambio, guardad el contenido original por si la liamos…

martes, 3 de julio de 2012

Ensamblados comerciales y builds de TFS

O cómo modificar las builds para TFS 2010.

Cuando estamos desarrollando una aplicación, es frecuente que necesitemos o decidamos utilizar algún componente comercial para simplificar el propio desarrollo o para mejorar la experiencia del usuario.

En este artículo vamos a revisar y solucionar un problema muy común que aparece cuando queremos realizar compilaciones automáticas de estos proyectos mediante Team Foundation Server 2010.

El problema

Pongamos que en mi aplicación estoy utilizando un control de menú muy ‘mono’, que me pinta las barras de herramientas como si de la Ribbon de Office se tratara.

Pongamos también que ese control de menú es comprado y licenciado, en la clásica licencia de componentes para .NET que requiere una licencia para cada desarrollador pero no requiere licencias de ejecución (ojo que este punto es importante, este artículo sólo aplica en estos casos)

Termino mi jornada y hago un check-in del formulario que desencadena una compilación en el servidor de Builds.

¡Sorpresa!

image

La causa

Si observamos la captura anterior, podemos ver que el error al compilar se está generando con el archivo “licenses.licx”

¿Pero qué es este archivo?

En las condiciones que hemos especificado en el punto anterior, en este archivo aparecen los componentes de terceros que estemos utilizando en nuestro proyecto y que además requieran de un control de licenciamiento en la máquina de desarrollo. El contenido concreto, que no voy a reproducir aquí, es una serie de líneas de texto ‘plano’ que indican la ‘firma’ de los componentes que requieren licenciamiento.

El problema que está encontrando el servidor de Builds es que al lanzar la compilación está realizando las operaciones necesarias para comprobar la licencia de todos los controles que aparezcan en este archivo.

Una posible solución

Revisando este problema por Internet, una de las propuestas que he encontrado es quitar ese archivo del control de versiones, con lo que al lanzar la compilación el archivo no existirá y en consecuencia el servidor no intentará validar las licencias. Reconozco que esta opción no la he probado, porque excluir un archivo del proyecto del control de versiones me da la sensación de que me puede acabar generando problemas a posteriori.

La solución

Como la primera alternativa no me convence, es hora de probar otra cosa. He leído por ahí que si el archivo está vacío, hará el mismo efecto que si está fuera del control de fuentes. Esto por si sólo tampoco es que sea una mejora de lo anterior, ya que tendríamos que vaciar el archivo ‘a mano’ antes de cada Build (inaceptable)

Lo que vamos a hacer a cambio, es generar una tarea personalizada para el flujo de compilación que cuando se ejecute limpiará el contenido del archivo automáticamente. De esta forma, las copias de trabajo y el control de fuente no corren riesgo de quedar en un estado inestable, y a su vez el proceso de compilación funcionará correctamente.

Al turrón

Vamos a trabajar con Visual Studio 2010.

Creación del proyecto

  1. Creamos una solución con dos proyectos de “Class Library”. Uno de los proyectos contendrá las tareas personalizadas (CustomBuildActivities) utilizando .Net 4 y el otro contendrá la plantilla de proceso que vamos a modificar para incluir nuestra tarea (CustomBuildProcess).
  2. Localizamos la plantilla de proceso por defecto “DefaultTemplate.xaml” y cambiándole el nombre la incluimos en el proyecto CustomBuildProcess. Una vez incluida, tenemos que modificar su propiedad “Build Action” a “XamlAppDef”.

    image

Creando una actividad personalizada

Para que este sistema funcione, necesitaremos una actividad que nos permita manipular el atributo de sólo lectura de nuestro archivo, ya que si está marcado como de sólo lectura, difícilmente podremos manipular su contenido.

En nuestro proyecto CustomBuildActivities añadimos un nuevo elemento de tipo “Workflow”, “Code Activity”, en este caso voy a utilizar el nombre “SetReadOnlyFlag”. El código de esta clase está disponible en el archivo adjunto y sus características más relevantes son las propiedades que definimos para controlar el Workspace donde el servidor de compilación almacena los archivos y los archivos a manipular.

Necesitamos también una actividad que nos permita modificar el contenido del archivo. Para esta actividad voy a utilizar el nombre “UpdateLicensesContent”. El código de esta clase está disponible también en el archivo adjunto y sus características más relevantes son las propiedades de definimos para localizar el archivo a manipular. Básicamente lo que hace esta actividad es localizar el archivo y, si no está vacío, vaciarlo.

Actualizando el flujo de trabajo de compilación

Hasta ahora hemos preparado unas actividades que nos permitirán manipular el archivo de licencias, pero ahora llega el momento de utilizarlas.

Para ello abrimos el proceso de Build en el proyecto “CustomBuildProcess”. En la caja de herramientas veremos las actividades que hemos programado anteriormente:

image

Lo que vamos a hacer va a ser ubicar nuestras tareas en el punto adecuado del flujo, para ello en el flujo localizamos la siguiente sección:

image

Justo después de “Get Workspace” añadimos una actividad de tipo “Sequence”, le cambiamos el nombre de manera adecuada y añadimos dentro la actividad personalizada que hemos creado “SetReadOnlyFlag”.

image

Los indicadores de error significan que nos falta informar las propiedades de la actividad, para ello vamos al panel de propiedades:

image

Lo que vamos a hacer es permitir a los usuarios especificar los valores de la propiedad “FileMask” en la ventana de definición de la Build, para darle más flexibilidad al sistema y además los valores de la propiedad “Workspace” estarán basados en la propia Build actual.

Para permitir a los usuarios interactuar con la propiedad “FileMask”, añadimos un nuevo “Argument” al Flujo que estamos personalizando, utilizando para ello el botón “Arguments” que aparece en la parte inferior del diseñador del Flujo. Una vez que se abre el panel de argumentos, vamos al final del mismo y hacemos clic en “Create Argument”, creando nuestro argumento (en este caso “LicensesMask”) e indicando el valor deseado:

image

Antes de utilizar este argumento en nuestra actividad, tenemos que habilitar su ‘presencia’ en la ventana de definición de la Build. Para esto en el panel de argumentos localizamos “Metadata” y añadimos un parámetro a la colección:

image

Una vez añadido el parámetro, actualizamos la propiedad “FileMask” en la actividad “SetReadOnlyFlag” para utilizar el argumento que acabamos de crear, así como el resto de propiedades:

image

Una vez configurada la actividad, añadimos a continuación la segunda actividad personalizada “UpdateLicensesContent” y otra instancia de la actividad “SetReadOnlyFlag” y establecemos sus correspondientes propiedades:

Actividad “UpdateLicensesContent”

image

Segunda actividad “SetReadOnlyFlag”

image

y ya está todo preparado para utilizar el nuevo proceso de Build.

Utilizar el nuevo proceso de Build

Para poder utilizar el proceso de Build, tenemos que asegurarnos de que tanto el propio proceso como las actividades personalizadas están disponibles para el sistema. Para ello lo más común es añadir la plantilla de proceso a la carpeta “BuildProcessTemplates” y las actividades en una subcarpeta, por ejemplo “CustomActivities”. Esta carpeta está accesible desde el Team Explorer:

image

Lo siguiente que tenemos que hacer es indicar al controlador de compilaciones dónde tiene que ir a buscar las actividades personalizadas, para ello en el elemento “Builds”, hacemos clic con el botón derecho del ratón y elegimos “Manage Build Controllers”

image

En la ventana que se abre especificamos la ruta a las actividades personalizadas:

image

Ahora ya podemos generar una nueva compilación que utilice nuestra plantilla de proceso.

Lo único que tenemos que tener en cuenta al generar la nueva definición de build es que en la pestaña “Process” tendremos que elegir nuestra plantilla personalizada en lugar de la que propone Visual Studio por defecto:

image

El resultado

Una configurado el nuevo proceso de compilación, el resultado del mismo ya, por fin, es el esperado:

image

El código asociado a este artículo estará disponible próximamente como adjunto y en Codeplex, en cuanto lo tenga publicado actualizaré esta entrada. Si alguien quiere más información no tiene más que dejar un comentario.

viernes, 30 de marzo de 2012

Outlook y el misterio de la carpeta perdida

Hoy toca un off-topic, ya que esta semana he tenido un problema con el correo electrónico, que al ser tan, por denominarlo de alguna manera, ‘curioso’ no he podido evitar dejarlo reflejado por si me vuelve a pasar.

Situación inicial

Normalmente tengo siempre el cliente de correo (en mi caso Outlook 2010) abierto, y siempre en la Bandeja de Entrada.
En un momento dado, al volver del calendario a los correos, no pude hacerlo con los accesos directos de la parte inferior (operación que realizo habitualmente) en lugar de abrir la Bandeja de Entrada, me aparecía debajo del calendario las carpetas del buzón:
image
Primer pensamiento: “He hecho algo raro” así que le doy al botón de “volver atrás” del ratón, y vuelvo a la Bandeja de Entrada.
En otro momento dado, voy a una de las carpetas de RSS que tengo configuradas, y al ir a volver a la Bandeja de Entrada, de repente no está (se puede ver en la captura anterior, donde ya tampoco no aparecía, aunque en ese primer momento no me fijé)
Como podéis imaginar, tras unos ‘pocos’ juramentos y expresiones ofensivas, me tranquilicé un poco al ver que los correos seguían entrando y que lo ‘único’ que había pasado (que no es poco) es que no tenía un enlace a la propia carpeta de la Bandeja de Entrada.

En busca de la solución

A la hora de buscar una solución el tema era complicado, ya que ‘conscientemente’ no había realizado ninguna operación con Outlook distinta de las que puedo realizar cualquier día, e incluso no estaba seguro de cuándo había desaparecido la dichosa carpetita.
Lo primero, copia de seguridad de todo el buzón, y, sobre todo de los contactos y el calendario.
Lo segundo, San Google.
Gracias a este santo, llego a una descarga en Codeplex que permite acceder a las ‘tripas’ de almacenes MAPI, así que a descargar y a ver si internamente está todo en orden.
La herramienta es “MFCMAPI” y este es el acceso.
Ojo porque la versión a ejecutar (32 o 64 bits) depende de la versión de Outlook (bueno, o del sistema, no estoy seguro, porque yo tengo ambos en 64 bits)

Al turrón

Ejecutamos la aplicación (no voy a hacer comentarios acerca de la apariencia…)
image
0.- Cerramos el Outlook.
1.- Hacemos clic en el menú “Session” y a continuación en “Logon…”
2.- Elegimos el perfil de correo que queremos revisar.
image
En la ventana de la aplicación se cargarán todos los almacenes que tengamos configurados.
3.- Elegimos el correspondiente al buzón que está dando problemas (ante la duda, posiblemente sea el que está marcado como almacén por defecto)
image
4.- Con el botón derecho del ratón, hacemos clic sobre el y elegimos “Open Store”. Se abrirá una nueva ventana con un estructura de árbol que contiene todo nuestro buzón:
image
5.- La carpeta que nos interesa el la “IPM_SUBTREE” así que la desplegamos. Esta carpeta muestra todo el contenido de nuestra estructura en el Outlook:
image
En mi caso al menos, suspiro de alivio: La carpeta “Bandeja de Entrada” aparece ahí, la primera, no ha huido de mí.
6.- Seleccionamos la carpeta Y revisamos las propiedades (y sus valores) que se cargan en la parte derecha de la ventana. A pesar de que la mayoría de elementos no me suenan de nada, hay uno que llama la atención, tanto por el nombre en sí como por el valor que tiene asignado:
image
Entiendo que no hace falta, pero por si acaso, la propiedad que me llama la atención es la que aparece resaltada “PR_ATTR_HIDDEN” con un valor de “True”.
¿Será casualidad que una propiedad de mi carpeta desaparecida que se llama “HIDDEN” esté a True? Vamos a probar (recuerdo que tengo por si acaso una copia de seguridad de todo… o de casi todo)
7.- Hacemos doble clic en la propiedad, y en la ventana que aparece, establecemos el valor de la misma a “False”:
image
8.- Confirmamos con “OK” y al volver a la pantalla anterior, vemos que el valor ha cambiado (en este punto, sólo por asegurarme, reinicié el programa y volví a navegar hasta esa pantalla sólo para ver si el valor se había reseteado, pero seguía correcto, a False)
9.- Cerramos la aplicación, cruzamos los dedos y lanzamos el Outlook y…
¡¡SOLUCIONADO!! Ya tengo de nuevo la carpeta de la Bandeja de Entrada y todo vuelve a la normalidad.

¿Alguna explicación?

Yo desde luego no la tengo, pero por lo menos he conseguido ‘apañarlo’ sin perder nada.

viernes, 23 de marzo de 2012

TFS Builds, error con “Tracker.exe”

Una rápida para terminar la semana…

Situación inicial

Tras instalar un nuevo servidor de compilación, la primera Build configurada para un proyecto de tipo Windows Forms, falla con el siguiente mensaje:

image

 

Posibles soluciones

Como indica el propio mensaje, hay varias soluciones posibles:

  1. Instalar el Windows SDK v7.0A o superior.
  2. Instalar Visual Studio 2010.
  3. Establecer ‘a mano’ una propiedad en el registro de Windows.
  4. Desactivar la operación que desencadena el error en la compilación.

La primera opción entiendo que es la mejor y la que aplicaré en el servidor de compilación, pero no quería tener que hacerlo hoy.

Las segunda y tercera opciones, pues cómo decirlo, no me convencen. No quiero tener que instalar Visual Studio 2010 en un servidor de CI, y por supuesto que NO quiero tampoco andar jugueteando con el registro (si no es estrictamente necesario)

La cuarta opción es la que he aplicado de manera temporal y la verdad es que funciona perfectamente.

Desactivar la generación de recursos incremental

En el mensaje lo pone muy fácil:

You can turn off incremental resource generation by setting the "TrackFileAccess" property to "false"

Investigando por Internet, he visto que es un parámetro que se le puede indicar al “MSBUILD”, e incluso que se puede añadir en la definición XML de la compilación.

Lo que no tenía tan claro era cómo aplicar ese parámetro a la definición de la compilación desde el propio Visual Studio, y al final ha sido sencillo, basta con introducir el parámetro en la definición de la compilación, como aparece en la siguiente captura:

image

Ojo porque hay que añadir la marca de parámetro, quedando así:

/p:TrackFileAccess=false

Una nota curiosa, otras compilaciones configuradas en el servidor funcionaban correctamente, pero ninguna utilizaba archivos de recursos…

Y ya está solucionado, ahora que no se me olvide instalar el dichoso SDK.