2011-01-09 14 views
6

Lector de larga duración, primera pregunta. fsi.exe es un ejecutable de .NET y, por lo tanto, contiene su propio ensamblaje completo con todos los métodos deliciosos y lo que fsi usa para ejecutar scripts F #.fsi.exe Ensamblaje: ¿Alguien sabe cómo incrustarlo?

Observando el ensamblaje en .NET Reflector (elija su clase, pero Shell es el mejor ejemplo) revela un montón de nombres basura * que parecen funciones decoradas de C++ (por ejemplo, de Dependency Walker). Incidentalmente y ligeramente al lado del punto, los ensamblajes F # se compilan de la misma manera, con muchos nombres basura *, lo que me lleva a pensar que fsi.exe se escribió en F #, ¿quizás como una prueba de usabilidad?

De todos modos, aquí está mi pregunta: ¿Alguien ha profundizado en fsi.exe y descubrió cómo incrustarlo en una aplicación .NET? Porque me gustaría usar F # como lenguaje de scripting, pero los programas se compilan para programas (sorpresa), y los scripts deben ser ejecutados por fsi.exe, lo cual es inaceptable en mi dominio (necesito una VM persistente). No espero una guía práctica sobre el uso de fsi.exe, pero tengo curiosidad por saber si alguien ha jugado con ella y, de ser así, ¿qué has descubierto sobre cómo funciona?

Gracias por su tiempo.

* Basura a primera vista. Obviamente están formateados de esta manera particular por una razón particular que está debajo del capó.

+1

Así que, básicamente, desea [eval] (http://en.wikipedia.org/wiki/Eval)? –

+1

Me pregunto, ¿la licencia de F # permite incrustar fsi en primer lugar? – Juliet

+0

@Juliet: ¿Por qué sería un problema de licencia? – leppie

Respuesta

6

Por lo que sé, fsi.exe no expone ninguna API que pueda usar para incrustarla en su aplicación (por ejemplo, para implementar scripts). Creo que hay básicamente dos opciones:

  • Si desea utilizar fsi.exe existente directamente, la única manera es iniciarlo mediante .NET Process clase y comunicarse con él de alguna manera. Esto debería ser factible: puede enviar comandos al proceso utilizando la entrada estándar. Para volver a leer la salida, puede usar la salida estándar, pero esto le brinda solo información limitada. Probablemente sería posible utilizar .NET Remoting para comunicarse entre fsi.exe y su aplicación (por ejemplo, los objetos cargados en el contexto del script en FSI enviarían información a su aplicación a través de Remoting).

  • Otra alternativa es utilizar el open-source release de F # y modificar fsi.exe para exponer toda la información que necesita como API. Esto requiere más esfuerzo para comprender cómo funciona fsi.exe, pero debería ser factible. Probablemente no necesite tantas adiciones: el estado mantenido por FSI contiene elementos como variables globales.

En cuanto a la licencia - es probable que no se puede utilizar fsi.exe distribuidos con Visual Studio. No estoy seguro acerca de fsi.exe que viene con la versión CTP. Compilarlo desde la fuente (disponible here) estará definitivamente bien (porque tiene una versión de código abierto).

+0

Gracias por la entrada, Tomás.Después de mirar el paquete de alimentación F #, de hecho veo que estaba escrito en F #, lo cual es deliciosamente irónico. Estoy en el proceso de estudiar detenidamente la fuente. Probablemente esto sea demasiado avanzado para adaptarme, pero de todos modos es interesante. Me encantaría valorarte para la respuesta integral, pero no tengo el representante para eso. – Tom

+0

¿Es posible insertarlo de alguna manera en otro dominio de aplicación? De esta forma, no tendrá la sobrecarga de otro .NET Process y tal vez sea más fácil de administrar arquitectónicamente. –

+0

@ashley - Desafortunadamente no, en este momento debe comenzarse como un proceso separado. –

Cuestiones relacionadas