6

长期读者,第一个问题。fsi.exe 是一个 .NET 可执行文件,因此包含它自己的程序集,其中包含所有美味的方法和 fsi 用来执行 F# 脚本的东西。

查看 .NET Reflector 中的程序集(选择你的类,但 Shell 是最好的例子)揭示了一堆看起来像修饰的 C++ 函数的垃圾 * 名称(例如,来自 Dependency Walker)。顺便说一句,有点题外话,F# 程序集以几乎相同的方式编译,有很多垃圾*名称,这让我认为 fsi.exe 是用 F# 编写的,也许是作为可用性证明?

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

谢谢你的时间。

* 垃圾一目了然。显然,出于某种特殊原因,它们以这种特殊方式格式化,这在引擎盖下。

4

2 回答 2

6

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

  • 如果您想fsi.exe直接使用现有的,唯一的方法是使用 .NETProcess类启动它并以某种方式与之通信。这应该是可行的——您可以使用标准输入向进程发送命令。要读回输出,您可以使用标准输出,但这只能提供有限的信息。可能会使用.NET Remoting 在fsi.exe您的应用程序之间进行通信(例如,在 FSI 的脚本上下文中加载的对象将通过 Remoting 将信息发送到您的应用程序)。

  • 另一种选择是使用F#的开源版本fsi.exe并进行修改以将您需要的所有信息公开为 API。这需要更多的努力才能了解其fsi.exe工作原理,但它应该是可行的。您可能不需要那么多添加 - FSI 维护的状态包含诸如全局变量之类的东西。

关于许可证 - 您可能无法fsi.exe与 Visual Studio 一起使用分发。我不确定fsi.exeCTP 版本是否附带了这一点。从源代码(可在此处获得)编译它肯定没问题(因为它具有开源版本)。

于 2011-01-09T09:21:44.500 回答
1

这里有一些工作代码:

http://www.codeproject.com/Articles/241577/Embedded-scripting-using-Fsharp

于 2012-09-20T23:11:00.897 回答