29/3/11

Error al ejecutar código de CRM 4.0 en un CRM 2011

La situación es la siguiente: estoy en el proceso de cambio de entorno de desarrollo entre la versión 4.0 y la 2011. En los proyectos nuevos uso esta última, pero aún hay código para otros clientes que usa la versión 4.0. Bueno, pues al ejecutar cualquier código (cliente, test, web etc.) sorbe la máquina de desarrollo en la que tengo instalado CRM 2011 me encuentro con un error del estilo Ensamblado no encontrado o No coincide la versión de ensamblado.

System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Crm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Microsoft.Crm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ---> System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'


La solución la da el gran David Jennaway en su blog. Hay que crear una sección del .config para invalidar una redirección de ensamblado en una política (incorrecta) introducida en CRM 2011.

<configuration>
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
   <assemblyIdentity name="Microsoft.Crm.Sdk"
     publicKeyToken="31bf3856ad364e35" culture="neutral" />
   <publisherPolicy apply="no" />
  </dependentAssembly>
  </assemblyBinding>
</runtime>
</configuration>

¡Gracias, David!

22/3/11

File - New - Project - Hola CRM 2011

Si habéis entendido el título estáis en el sitio adecuado. Esto es, un ejemplo de código minimalista para conectarse a CRM 2011 a través de la SDK, tanto On-Premise como On-line.

Abrimos Visual Studio 2010 y creamos un proyecto de tipo Consola sobre .NET framework 4.0 (¡Primera vez que los desarrolladores de CRM no vamos un paso por detrás del Framework!).

Añadimos las referencias:

  • System.ServiceModel porque usamos WCF
  • System.Runtime.Serialization serialización estándar de .NET
  • microsoft.xrm.sdk para las clases específicas de CRM (en la carpeta bin de la SDK)

Añadimos los namespaces:

using System;
using System.ServiceModel.Description;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;

namespace HolaCRM2011
{
class Program
{
static void Main(string[] args)
{
}
}
}

La forma de crear un proxy para llamar a los servicios WCF de CRM On Premise es bien sencilla. La clase ServiceConfigurationFactory nos proporciona un método CreateConfiguration que devuelve un objecto de configuración que representa la mitad de la información que necesitamos para conectarnos a CRM: el endpoint de WCF. Esta dirección la podemos recordar navegando a la sección Configuration - Settings - Customizatins - Developer resources


var config = 
ServiceConfigurationFactory.CreateConfiguration<IOrganizationService>(
new Uri("http://localhost:5555/MiOrganizacion"));
var servicio = new OrganizationServiceProxy(config, new ClientCredentials());

Y por último, invocar un método CRUD sobre el servicio. En este caso, el clásico "Crear contacto". La novedad aquí es que ya no tenemos que usar las clases wrapper de CRM sino que podemos tirar directamente con los tipos básicos de .NET. Así, por ejemplo, en lugar de usar un CrmNumber usamos directamente un int.


var contacto = new Entity("contact");
contacto["firstname"] = "Nombre";
contacto["lastname"] = "Apellidos";
contacto["numberofchildren"] = 2;
var id = servicio.Create(contacto);

Si queremos trabajar con CRM Online, la cosa se complica un poco. Afortunadamente para programadores como yo (con facilidad para "abstraernos") toda esa complicación está resuelta en la clase de ayuda CrmConnection que encontramos en la dll microsoft.xrm.client


var connectionString =
@"Url=https://miorg.crm4.dynamics.com;
Username=miliveid@hotmail.com;
DeviceID=MIDEVICEID-aa9f617b2e6d;
DevicePassword=MiDevicePass@word;
Password=MiPass@word";
var connection = CrmConnection.Parse(connectionString);
var servicio = new OrganizationService(connection);

Como se ve, la cadena de conexión tiene la misma pinta que las de ADO.NET de toda la vida e incluye también las credenciales. Lo que daba más guerra en versiones anteriores de la SDK (vamos por la 5.0.2) era registrar el dispositivo(Aquí resuelto con DeviceID y DevicePassword). Este parte de la conexión controla la autenticación basada en claims, que es un tema demasiado vasto y desconocido para mi como para hincarle el diente. La parte buena es que ... funciona. La primera vez que se llama al servicio, si no conoce el dispositivo, lo registra contra Live con el password especificado y obtiene un token. En las siguientes llamadas no necesitará este paso y llama directamente a CRM, aunque como programadores "abstraídos" ni nos enteraremos...


El programa completo quedaría así:


using Microsoft.Xrm.Client;
using Microsoft.Xrm.Client.Services;
using Microsoft.Xrm.Sdk;

namespace HolaCRM2011
{
class Program
{
static void Main(string[] args)
{
var connectionString =
@"Url=https://miorg.crm4.dynamics.com;
Username=miliveid@hotmail.com;
DeviceID=MIDEVICEID-aa9f617b2e6d;
DevicePassword=MiDevicePass@word;
Password=MiPass@word";
var connection = CrmConnection.Parse(connectionString);
var servicio = new OrganizationService(connection);

var contacto = new Entity("contact");
contacto["firstname"] = "Nombre";
contacto["lastname"] = "Apellidos";
contacto["numberofchildren"] = 2;
var id = servicio.Create(contacto);
}
}
}

Sólo hay que cambiar los datos particulares (todos los que empiezan por "Mi") por los de la organización de CRM 2011 online. También se puede escoger un identificador de dispositivo y password de dispositivo propios.

14/3/11

Nuevo explorador de metadatos en CRM 2011

cap1Es agradable ver que las herramientas que tienes que usar cada día van mejorando con cada versión. Hoy le toca al Metadata browser de CRM. En la versión 2011 el equipo de la SDK ha hecho un gran trabajo y ha escuchado las quejas sugerencias de los desarrolladores que tuvimos que vérnoslas con el /sdk/list.aspx de las versiones anteriores. Ahora está empaquetado como una solución que se puede importar al entorno de desarrollo y que se entrega como un web resource en HTML y JavaScript, muy rápido y sencillo de manejar.

 

Para usarlo, hay que descargar la SDK (desde aquí), navaegar a la carpeta sdk/tools/metadatabrowser e instalar en CRM la solución gestionada metadatabrowser_1_0_0_1_managed.zip

El resultado es una herramienta muy útil para el desarrollador, que permite ver todas las entidades, atributos y recursos desplegados en una solución de CRM.

cap2