2011-01-09 78 views
6

很长时间的读者,第一个问题。 fsi.exe是一个.NET可执行文件,因此包含自己的程序集,包含所有美味的方法,以及fsi用于执行F#脚本的内容。fsi.exe汇编:任何人都知道如何嵌入它?

看看.NET Reflector中的程序集(选择你的类,但Shell是最好的例子)揭示了一堆看起来像装饰C++函数(比如说来自Dependency Walker)的垃圾*名称。顺便说一下,F#程序集的编译方式大同小异,有大量垃圾*名称,这让我认为fsi.exe是用F#编写的,也许是作为可用性证明?

无论如何,这里是我的问题:有没有人深入研究fsi.exe并想出如何将它嵌入到.NET应用程序中?因为我想使用F#作为脚本语言,但程序编译为(惊喜)程序,并且脚本必须由fsi.exe执行,这在我的域中是不可接受的(我需要一个持久的VM)。我不希望有关如何使用fsi.exe的指导,但我很想知道是否有人玩过它,如果是的话,你发现它是如何工作的?

谢谢你的时间。

*垃圾随便一瞥。显然,它们是以这种特殊方式格式化的,这是因为引擎盖下的特定原因。

+1

所以基本上,你想[的eval(http://en.wikipedia.org/wiki/Eval)? – 2011-01-09 01:30:00

+1

我有点想知道,F#的许可证是否允许首先嵌入fsi? – Juliet 2011-01-09 04:58:20

回答

6

据我所知,fsi.exe没有公开任何可用于将其嵌入到应用程序中的API(例如,用于实现脚本)。我认为主要有两种选择:

  • 如果您想直接使用现有fsi.exe,唯一的办法就是使用.NET Process类来启动它,不知何故与它通信。这应该是可行的 - 您可以使用标准输入将命令发送到进程。要读回输出,您可以使用标准输出,但这只能提供有限的信息。它可能会使用.NET Remoting在fsi.exe和您的应用程序之间进行通信(例如,您在FSI的脚本上下文中加载的对象将通过远程处理将信息发送到您的应用程序)。

  • 另一种替代方法是使用F#的open-source release并修改fsi.exe以公开作为API需要的所有信息。这需要更多的努力才能理解fsi.exe如何工作,但它应该是可行的。你可能不需要那么多的补充 - 由FSI维护的状态包含诸如全局变量之类的东西。

关于许可证 - 你可能不能使用fsi.exe与Visual Studio分发。我不确定CTP版本附带的fsi.exe。从源代码编译(可用here)肯定没问题(因为它有开源版本)。

相关问题