sábado, 4 de septiembre de 2010

Función Eval() de JavaScript en C#

Llevaba un tiempo buscando la forma más fácil de crear un evaluador de expresiones para un programa realizado en C#, y tras probar varias alternativas creo que utilizar la función Eval() de JavaScript desde el código de un programa escrito en C# es la mejor opción.

Para poder utilizar el método Eval comenzaremos creando un fichero JavaScript llamado Evaluador.js que contendrá lo siguiente:

package Evaluador
{
  class JSEvaluador
  {
    public static function Eval(expr : String) : String
    {
      return eval(expr);
    }
  }
}

A continuación compilaremos dicho código para crear una dll para poderla usar en nuestros proyectos, esto lo realizaremos mediante la consola del sistema, introduciendo la siguiente instrucción:

jsc /target:library Evaluador.js

Si la consola nos indica que no reconoce la instrucción jsc, significa que tendremos que modificar la variable de entorno PATH para poder ejecutar jsc.exe desde la consola.

Para modificar la variable de entorno PATH
  1. Utilice la característica de búsqueda de Windows para localizar el archivo jsc.exe en la unidad.El nombre exacto del directorio donde se encuentra jsc.exe depende del nombre y la ubicación del directorio Windows, y de la versión instalada de .NET Framework.Si se han instalado varias versiones de .NET Framework, deberá determinar la versión que va a utilizar (normalmente, la más reciente).

    Por ejemplo, el compilador se podría encontrar en C:\Windows\Microsoft.NET\Framework\v2.0.50727.

  2. Para mostrar el cuadro de diálogo Información del sistema, haga clic con el botón secundario en Equipo o Mi PC en el escritorio y, a continuación, haga clic en Propiedades.

  3. Si usa Windows Vista o Windows 7, haga clic en Configuración avanzada del sistema en la ventana Panel de control resultante.

  4. En la pestaña Opciones avanzadas del cuadro de diálogo Propiedades del sistema, haga clic en el botón Variables de entorno.

  5. En Variables del sistema, seleccione Path en la lista y haga clic en Modificar.

  6. En el cuadro de diálogo Modificar la variable del sistema, desplace el cursor hasta el final de la cadena en el cuadro Valor de variable y escriba un punto y coma (;) seguido del nombre de directorio completo localizado en el paso 1.

    Por ejemplo, si el compilador está en la ubicación especificada en el ejemplo del paso 1, escribiría lo siguiente:

    ;C:\Windows\Microsoft.NET\Framework\v2.0.50727

  7. Haga clic en Aceptar para aceptar los cambios y cerrar los cuadros de diálogo.

  8. Abra un nuevo símbolo del sistema.

Después de cambiar la variable de entorno PATH, podrá ejecutar el compilador de JScript en el símbolo del sistema de Windows desde cualquier directorio del equipo.

Finalizada dicha operación obtendremos una dll llamada Evaluador.dll. Ahora sólo nos queda añadirla a nuestro proyecto para poder hacer uso del método Eval así como una referencia a “Microsoft.JScript”.

A continuación veremos un pequeño programa de consola de prueba.

using System;
using Evaluador;

 

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {

            Console.WriteLine("Calculadora");

            Console.WriteLine("Introduzca una expresión aritmética para ser evaluada.");

            Console.WriteLine("Escriba 'exit' para salir.");

            Console.WriteLine();

            string line = string.Empty;

            do
            {

                Console.Write("> ");

                line = Console.ReadLine();

                if (line == "exit")

                    break;

                Console.WriteLine(JSEvaluador.Eval(line));

            } while (true);

        }

    }
}

Es algo sencillo pero que tiene muchas utilidades. A partir de ahora ya podremos evaluar todo tipo de operaciones aritméticas desde nuestro programa en tiempo de ejecución.

En mi caso yo he usado esto para un programa de gestión, que le permite al usuario utilizar fórmulas para calcular los distintos precios, ya sean mediante puntos o porcentajes. Es el usuario el que decide. Aunque es más complicado de usar, las posibilidades son mucho mayores.

artículos

Fuentes:

http://msdn.microsoft.com/es-es/library/7435xtz6.aspx

http://www.codeproject.com/KB/cs/CSharpJavascriptEvalFunc.aspx