Desde Rollup 5 para CRM 2011, algunos clientes nos han reportado problemas a la hora de actualizar el sistema al último Rollup.

El problema que vamos a estudiar hoy ocurre nada más hacer doble click sobre el fichero que contiene el instalador del Rollup, y consiste en que la instalación se interrumpe con el siguiente mensaje de error:

Method not found:

Seguido de una línea que indica el método que ha fallado. Por ejemplo esta, aunque puede variar:

Microsoft.Crm.ConfigurationDatabase.ConfigurationMetadata.GetSiteConfigDBConnection()

 

Para explicar cual puede ser la causa de este problema, tenemos que bajar hasta el nivel del código fuente e imaginarnos que estamos buscando una función en un archivo que no contiene dicha función.

¿Cuándo puede suceder tal cosa? Pues muy sencillo: cuando el archivo es viejo o está desactualizado.

¿Y cómo puede ser que estemos buscando dentro de un archivo viejo, en lugar de usar la última versión contenida en la carpeta de instalación?

Aquí es donde entra el funcionamiento de la caché de librerías del sistema, también conocida como Global Assembly Cache, o GAC.

Cualquier librería (archivo .dll) que pongamos en la GAC tendrá prioridad sobre las librerías contenidas en otras carpetas. De hecho, poner una librería en la GAC es como hacer que la librería sea accesible desde cualquier punto del sistema.

Así pues, si la GAC contiene una versión vieja del fichero al que queremos llamar, se hará uso de la versión incorrecta, y es probable que el método deseado no se encuentre ahí.

 

Segunda parte: Vale, muy interesante, pero…¿cómo se soluciona el problema?

La solución al problema pasa por eliminar la versión vieja de la GAC, o reemplazarlo por una versión nueva del mismo fichero. Por supuesto, si esta librería se usa para otros desarrollos, el desarrollador deberá tener ojo antes de cargarse un componente que podría ser necesario.

La GAC se compone de la carpeta C:\Windows\Assembly, y de otras carpetas virtuales. La opción más fácil para encontrar la carpeta donde está el fichero, es simplemente buscar su nombre en toda la unidad C.

Para averiguar el nombre del fichero que hay que reemplazar, en la mayoría de casos basta con mirar la ruta del método al que se está llamando. En este caso: Microsoft.Crm.ConfigurationDatabase.ConfigurationMetadata.GetSiteConfigDBConnection().

El fichero que buscamos se llamará Microsoft.Crm.dll. En otros casos más complejos habría que echar un ojo al código fuente de la aplicación para saber a qué librería pertenece el método.

Por Luis Mazarío