HOWTO: Ejecutar tu propio código .NET en Dynamics AX 2009

Aunque esto es algo que tiende a desaparecer en el próximo Microsoft Dynamics AX 2012, de momento es una funcionalidad muy útil en la versión 2009, ya que es la única manera de solventar algunas limitaciones técnicas.

Me estoy refiriendo a la posibilidad de utilizar el .NET CLR Interop para ejecutar desde nuestro código X++ librerías desarrolladas en .NET (ya sea C# o VB.NET). Esta integración también tiene sus propias limitaciones pero amplía de manera notable las posibilidades de desarrollo en AX 2009.

Voy a hacer un ejemplo paso a paso, y el primer paso es crear la propia librería desde Visual Studio. En mi caso voy a utilizar (el ya súper antiguo) Visual Studio 2005 para crear un nuevo proyecto “Biblioteca de clases”:

Dynamics AX 2009 DLL Interop

El código va a ser muy sencillo para no complicar la prueba, simplemente devolverá el nombre del equipo donde se ejecuta el código (esto se puede utilizar para comprender la ejecución de código en el cliente (devolverá la máquina local) o en el servidor (devolverá el AOS):

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;

namespace JAEE.AX
{
    public class EjemploLibreria
    {
        public string computerName()
        {
            string localComputerName = Dns.GetHostName();

            return localComputerName;
        }
    }
}

Este código y la DLL compilada está disponible en el fichero que adjunto al final, junto con un pequeño programa de consola para probar la DLL desde el propio Visual Studio.

Ahora vamos a lo interesante. El primer paso será añadir la referencia a la DLL desde AX. Esto se puede hacer de dos maneras, o referenciando directamente el fichero .dll o registrando la dll en la librería de ensamblados de Windows y referenciarla desde ahí. A mí me gusta esta última manera que requiere un par de pasos más:

Para registrar la librería hace falta tener instalada la Global Assembly Cache Tool (gacutil.exe) que viene incluida con el SDK del Framework .NET. Una vez instalado (probablemente ya lo tendrás instalado) se registra la DLL utilizando el comando de consola gacutil /i:

Dynamics AX 2009 DLL Interop

Y ahora sí, vamos a Dynamics AX 2009, buscamos en el AOT el nodo References y agregamos una nueva:

Dynamics AX 2009 DLL Interop

Aquí es donde Dynamics AX nos deja examinar un fichero DLL o buscar uno existente en el Assembly. Como la nuestra ya está registrada simplemente hay que buscarla en la lista, pulsar Seleccionar y Aceptar.

Dynamics AX 2009 DLL Interop

Se crea un nuevo nodo en las Referencias con el nombre de la librería. Como “best practice“, a mi me gusta añadir al nombre del AOT el namespace completo de la librería ya que lo vamos a tener que incluir en el código y al cabo de un tiempo es difícil acordarse de todos. Desde este momento Dynamics AX ya sabe de la existencia de la librería por lo que podemos utilizarla en nuestro código X++:

Dynamics AX 2009 DLL Interop

A partir de aquí es muy sencillo, este es un Job que utiliza la librería que acabamos de referenciar:

static void JAEE_EjemploLibreriaNET(Args _args)
{
    JAEE.AX.EjemploLibreria miDLL;

    InteropPermission       permission;
    str                     ret;
    ;

    try
    {
        permission = new InteropPermission(InteropKind::DllInterop);
        permission.assert();

        miDLL = new JAEE.AX.EjemploLibreria();
        ret = miDLL.computerName();

        info(strfmt("Nombre del equipo: %1", ret));
    }
    catch
    {
        error("Ha habido algún problema con la DLL de ejemplo");
    }
}

Para que el que le interese probar, adjunto el código X++ de Dynamics AX y un rar con el mini-proyecto de Visual Studio y la DLL compilada:

Descarga

5 comentarios
  • jaestevan
    julio 25, 2012

    Se pueden ejecutar servicios de terceros agregando una referencia de servicio, aunque la implementación en AX 2009 tiene algunas limitaciones. En AX 2012 ha mejorado mucho.

    Si se encuentra con estas limitaciones, de seguridad por ejemplo, puede hacer la implementación en .NET y empaquetar el código utilizado en una librería -DLL que se utiliza como una referencia normal tal cual explico en el post.

    Saludos.

  • Pedro
    julio 20, 2012

    Hola muy buen aporte pero como puedo hacerlo con web services de terceros desde el AX agradeceria tu respuesta…

  • Cesar
    noviembre 21, 2011

    Muchas gracias

  • jaestevan
    noviembre 17, 2011

    Hola Cesar,

    Si tu programa es una DLL ésta es la manera de hacerlo. Si está compilado como un ejecutable sólo puedes llamarlo usando una llamada al API de Windows (con las clases WinAPI o WinAPIServer)

    Saludos.

  • Cesar
    noviembre 17, 2011

    Muy buena tu publicación. ¿Sabes algo de como ejecutar un programa hecho con .net y ejecutarlo desde Ax? (como vertical)