Compilador mono como servicio (MCS)
Me gustaría consumir el compilador de Mono como un servicio de mi aplicación .NET 3.5 habitual.
Descargué los últimos bits (2.6.7), creé una aplicación de consola simple en Visual Studio y hice referencia al dll Mono.CSharp.
Luego, en mi aplicación de consola (directamente de una muestra en línea):
Evaluator.Run("using System; using System.Linq;");
bool ress;
object res;
Evaluator.Evaluate(
"from x in System.IO.Directory.GetFiles (\"C:\\\") select x;",
out res, out ress);
foreach (var v in (IEnumerable)res)
{
Console.Write(v);
Console.Write(' ');
}
Esto arroja una excepción en Evaluator.Run (la primera línea):
Illegal enum value: 2049.
Parameter name: access
Esto se debe a que el dll fue compilado usando Mono.exe, no csc.exe, creo.
He intentado descargar el dll Mono.CSharp directamente desdehttp://tirania.org/blog/archive/2010/Apr-27.html en el archivo demo-repl.zip ... y eso no arroja una excepción ... Sin embargo, el parámetro out (res) después de llamar a Evaluator.Evaluate es nulo ... así que no estoy seguro de qué está sucediendo. No se lanza ninguna excepción ...
Entonces, me gustaría descubrir por qué el dll que descargué de demo-repl.zip devuelve nulo.
EDITAR: descubrí por qué devuelve nulo. Parece que por alguna razón el compilador no está recogiendo el espacio de nombres System.Linq ... aunque no puedo decir por qué ... Si solo evalúo "System.IO.Directory.GetFiles (\" C: \\ ")", funciona bien.
ACTUALIZACIÓN: Definitivamente parece que hay algo mal con el compilador Mono al elegir ensamblados de sistema referenciados. Si copio directamente la muestra de su herramienta de consola csharp:
csharp> var list = new int [] {1,2,3};
csharp> var b = from x in list
> where x > 1
> select x;
csharp> b;
Me sale la excepción:
{interactive}(1,25): error CS1935: An implementation of `Select' query expressio
n pattern could not be found. Are you missing `System.Linq' using directive or `
System.Core.dll' assembly reference?
Además, para que el MCS sea realmente una solución factible, necesitaré modificar el compilador para que emita a un único ensamblado dinámico, en lugar de emitir un ensamblaje por llamada de evaluación (de lo contrario, presenta una pérdida de memoria importante, que He tratado antes en forma de CSharpCodeProvider). ¿Alguien tiene una idea de lo difícil que será esto o alguien puede señalarme en la dirección correcta aquí?
Gracias.