domingo, septiembre 27, 2009

Otra de las de M$

Hoy me tope con otro de esos errores en los que M$ se especializa tanto. El error en cuestión aparecía al momento de compilar el proyecto, luego de incluir una clase que hacia referencia a clases contenidas en System.Data.SqlClient:

genasm.exe(1) : error There was an error initializing Tracker.Helpers.CFSqlSP. Could not load file or assembly 'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969db8053d3322ac, Retargetable=Yes' or one of its dependencies. El sistema no puede hallar el archivo especificado.

Luego de mucho investigar y probar, incluyendo una reconstrucción del proyecto en VS, encontré que el error era causado por la presencia del archivo DesignTimeAttributes.xmta, el cual contiene atributos personalizados utilizados por el editor de diseno de VS. En mi caso particular, este archivo contenía la propiedad DesktopCompatible(true) para varios controles de usuario en uso dentro del proyecto.

Una búsqueda exhaustiva en Google arrojo varias posible soluciones, que al menos a mi no me funcionaron:

  • Excluir el archivo XMTA del proyecto: esto efectivamente eliminaba el error al compilar, pero impedía cargar en el diseñador cualquier forma que contuviera controles de usuario heredados.
  • Incluir manualmente la referencia a los DLLs indicados en el error, dentro del archivo del proyecto.

Al final, y solo luego de mucho buscar, encontré un post de una persona llamada Joaquin Raya, que ofrecía la mejor explicación que encontré sobre la raíz del problema. Según explica Joaquin en su post, el problema es causado por un bug en VS 2008 el cual, cuando se usa el archivo XTMA dentro de un proyecto, causa una confusión dentro de las rutas de búsqueda de los DLLs, causando que VS intente ubicar las DLLs especificas de .NET CF dentro de los archivos del .NET Framework.

Su solución resulto ser bien sencilla: ubicar los DLLs indicados en el error e instalarlos en el GAC. En mi caso particular, lo hice de la siguiente forma:

  1. Abrí una ventana de Explorer en la carpeta C:\Archivos de Programa\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE
  2. Abrí otra ventana de Explorer en la carpeta C:\Windows\assembly
  3. Seleccioné los archivos System.dll y System.Data.dll en la carpeta WindowsCE y los arrastre sobre la carpeta assembly.

Nótese que, aun cuando mi proyecto estaba basado en el .NET CF 3.5, el error hacia referencia a archivo System.dll versión 2.0.0.0. Hay que fijarse bien en esto para saber que versión de los DLL se debe copiar en el GAC.

Y saben lo mas triste de todo el caso? que este mismo error ya había sido reportado en VS 2005 y corregido en su SP1.... solo para reaparecer vivito y coleando en VS 2008.... hay que ver!!


Gracias M$, por mas de dos horas improductivas y estresantes