Tom*_*Tom 6 .net embed f# assemblies scripting-language
很长一段时间的读者,第一个问题.fsi.exe是一个.NET可执行文件,因此包含自己的程序集,其中包含所有美妙的方法以及fsi用于执行F#脚本的内容.
查看.NET Reflector中的程序集(选择你的类,但Shell是最好的例子)显示了一堆看起来像装饰C++函数的垃圾*名称(例如,来自Dependency Walker).顺便提一下,F#程序集的编译方式大致相同,有很多垃圾*名称,这让我觉得fsi.exe是用F#编写的,也许是作为可用性证明?
无论如何,这是我的问题:有没有人深入研究fsi.exe并想出如何将其嵌入到.NET应用程序中?因为我想使用F#作为脚本语言,但程序编译为(惊喜)程序,脚本必须由fsi.exe执行,这在我的域中是不可接受的(我需要一个持久的VM).我不希望有关使用fsi.exe的操作指南,但我很想知道是否有人玩过它,如果有的话,你发现了它是如何工作的?
谢谢你的时间.
*随便看一眼垃圾.显然,他们的格式是这种特殊的方式,因为特殊原因是在幕后.
据我所知,fsi.exe不公开任何可用于将其嵌入应用程序的API(例如,实现脚本).我认为基本上有两种选择:
如果要fsi.exe直接使用现有,唯一的方法是使用.NET Process类启动它并以某种方式与它通信.这应该是可行的 - 您可以使用标准输入向流程发送命令.要读回输出,可以使用标准输出,但这只会提供有限的信息.可能会使用.NET Remoting在fsi.exe您的应用程序之间进行通信(例如,在FSI的脚本上下文中加载的对象将通过Remoting向您的应用程序发送信息).
另一种方法是使用F#的开源版本并进行修改fsi.exe以公开API所需的所有信息.这需要更多的努力才能理解fsi.exe它是如何工作的,但它应该是可行的.你可能不需要那么多的补充 - 由FSI维护的状态包含诸如全局变量之类的东西.
关于许可证 - 您可能无法使用fsi.exeVisual Studio分发.我不确定fsi.exeCTP版本附带的内容.从源代码编译它(这里可用)肯定会很好(因为它有开源版本).