Errores de tipo "could not load type"
¿Alguna vez os habéis encontrado en CRM con errores del tipo...
“Could not load type 'Microsoft.Xrm.Sdk.Workflow.ICustomActivityExecutionContext' from assembly 'Microsoft.Xrm.Sdk.Workflow, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'” ?
Ya sea una dll propia de CRM como en el caso anterior, o una personalizada nuestra, a veces nos encontramos con estos errores y no sabemos a qué se deben. Para intentar averiguarlo aquí van unas sugerencias:
1. Como es habitual el primer paso debería ser tomar una traza de CRM para tener más detalles del error. Esto lo podemos hacer utilizando la herramienta de diagnóstico o activando las trazas (https://support.microsoft.com/kb/907490).
2. Como siguiente paso podemos abrir Process Monitor para ver dónde está buscando la dll anterior y qué está pasando. Podéis descargar la herramienta de aquí:
(https://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)
Comenzad la captura hasta que aparezca el error y entonces pararla. Para filtrarla podemos aplicar los siguientes filtros:
- Si por ejemplo el error nos aparece para el servicio asíncrono de CRM, aplicaremos este filtro:
Process Name – is - CrmAsyncService.exe – then include -> Add
- Otro filtro para dejar solo lo relacionado con el assembly que menciona el error:
Path – contains - Sdk.Workflow – then Include -> Add
Click Apply y OK. Ahora veremos una lista tal que así:
Si nos fijamos en las columnas de Result, Operation y Path podremos tener más información sobre los accesos a la dll.
3. Fusion log
Si tenéis instaladas las herramientas de Visual Studio (https://msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx):
- Abrid el command promt de Visual Studio como administrador y lanzar “fuslogvw”. Esto abre el visor de logs de fusión.
- Settings -> Log bind failures, e indicar una ruta donde guarder los logs:
- Settings -> Log all binds to disk (solo si no hay errors durante el binding y queremos averiguar en qué ruta estará la dll que buscamos.
- ISSReset y abrid CRM -> nos generará todos los logs en la ruta y aparecerán en el visor.
Si no tenéis las herramientas de Visual Studio:
- Id a:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
- Añadir:
DWORD LogFailures valor a 1
DWORD LogResourceBinds valor a 1
String LogPath a la carpeta donde queramos guardar los logs (
por ejemplo. C:\FusionLog\)
- Igualmente, si no tenemos errores pero queremos ver a dónde va la dll añadid
tambien:
DWORD ForceLog valor a 1
- IISReset y abrid CRM -> nos generará todos los logs en la ruta.
- Ahora abrid los logs para la dll que buscáis y ver dónde busca la dll, dónde se
crea la imagen nativa, etc y qué fallos da.
- Deshabilitarlo (en el fusion log viewer o poniendo las regkeys a 0) cuando terminemos.