长期的读者,第一个问题。 fsi.exe是.NET可执行文件,因此包含其自己的程序集,该程序集包含所有美味的方法以及fsi用于执行F#脚本的内容。
查看.NET Reflector中的程序集(选择您的类,但Shell是最好的示例),发现了一堆看起来像经过修饰的C++函数(例如,来自Dependency Walker)的垃圾名称。顺便提一下,F#程序集的编译方式几乎相同,有很多垃圾*名称,这使我认为fsi.exe是用F#编写的,也许是作为可用性的证明?
无论如何,这是我的问题:有没有人研究过fsi.exe并弄清楚如何将其嵌入到.NET应用程序中?因为我想使用F#作为脚本语言,但是程序会编译为(意外的)程序,并且脚本必须由fsi.exe执行,这在我的域中是 Not Acceptable (我需要一个永久VM)。我不希望使用fsi.exe的使用指南,但是我很好奇是否有人在玩它,如果可以,您对它的工作原理有何发现?
谢谢你的时间。
*随便看看垃圾。显然,出于某些特殊原因,它们是通过这种特殊方式格式化的,而这是引擎盖下的特定原因。
最佳答案
据我所知,fsi.exe
不会公开任何可用于将其嵌入到应用程序中的API(例如,用于实现脚本编写)。我认为基本上有两种选择:
fsi.exe
,则唯一的方法是使用.NET Process
类启动它,并以某种方式与其通信。这应该可行-您可以使用标准输入将命令发送到流程。要读回输出,可以使用标准输出,但这仅给您有限的信息。可能可以使用.NET Remoting在fsi.exe
和您的应用程序之间进行通信(例如,您在FSI的脚本上下文中加载的对象将通过Remoting向您的应用程序发送信息)。 fsi.exe
以将您需要的所有信息公开为API。为了理解fsi.exe
的工作原理,这需要付出更多的努力,但它应该是可行的。您可能不需要那么多的添加-FSI维护的状态包含诸如全局变量之类的内容。 关于许可证-您可能无法使用随Visual Studio一起分发的
fsi.exe
。我不确定CTP版本随附的fsi.exe
。从源代码编译(可用here)绝对可以(因为它具有开源版本)。关于.net - fsi.exe程序集: Anyone know how to embed it?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4637181/