c# - para las secuencias de comandos `dynamic` no es compatible con Roslyn y está disponible solo con mono, pero el mono falla en la DLL
python.net scriptcs (1)
Intento cargar pythonnet runtime dll desde scriptcs y no funciona con el back-end de roslyn porque la dinámica no es compatible con Roslyn, pero el backend mono se bloquea con el siguiente error:
$ scriptcs -modules mono
scriptcs (ctrl-c to exit or :help for help)
> #r "F:/Python/Python27/Lib/site-packages/Python.Runtime.dll"
error CS0009: Metadata file `F:/Python/Python27/Lib/site-packages/Python.Runtime.dll'' does not contain valid metadata
Pregunta:
¿Cómo puedo obtener Mono backend de scriptcs trabajando con Python.Runtime.DLL? ¿Debo cargar cualquier archivo DLL antes de eso? ¿Tiene que compilar Python.Runtime.DLL con soporte Mono o .NET está bien?
Este error (CS0009 con compilador mono) es bastante genérico y significa "algo incorrecto" con el ensamblado dado, por lo que es bastante difícil de depurar. Una manera de proceder es compilar bajo mono. Si descarga su código fuente ( https://github.com/pythonnet ) encontrará instrucciones sobre cómo hacerlo (consulte pythonnet / src / monoclr / README.txt también).
Sin embargo, dependiendo de sus objetivos, puede considerar usar IronPython en su lugar, que es oficialmente compatible con mono y se ejecuta fuera de la caja. El siguiente ejemplo supone que ha descargado el archivo zip de IronPython y lo ha extraído en alguna parte:
scriptcs -modules mono
scriptcs (ctrl-c to exit or :help for help)
> #r "G:/dev_tools/IronPython-2.7.5/IronPython-2.7.5/IronPython.dll"
> #r "G:/dev_tools/IronPython-2.7.5/IronPython-2.7.5/Microsoft.Dynamic.dll"
> #r "G:/dev_tools/IronPython-2.7.5/IronPython-2.7.5/Microsoft.Scripting.dll"
> using System;
> using System.IO;
> using IronPython.Hosting;
> using Microsoft.Scripting;
> using Microsoft.Scripting;
> using Microsoft.Scripting.Hosting;
> string script = "print ''hello world''";
> var engine = Python.CreateEngine();
> var scope = engine.CreateScope();
> var source = engine.CreateScriptSourceFromString(script, SourceCodeKind.Statements);
> var compiled = source.Compile();
> var result = compiled.Execute(scope);
hello world
>