在C#中运行F#代码 – (与C#中的C#一样使用Roslyn)

有没有办法在C#中运行F#代码? 我在C#中编写了一个应用程序 – 我想让它能够执行F#,读取Record对象,枚举来自F#的列表。 目前的解决方案是什么? 我知道将来可能有办法通过更新Roslyn来做到这一点。 此外,好奇如何在F#中运行F#代码,目前。 有没有办法轻松做到这一点?

目前,您必须使F#成为库,然后从C#调用它。 由于F#只是.NET,因此使用F#库(大部分)就像使用任何其他C#库一样。 但是,您可能希望查看FSharpX的这一部分,因为它提供了一些实用程序来简化从C#调用F#,反之亦然。

如果要从C#动态编译F#,则需要使用F#Power Pack中的F#CodeDom实现。 这将允许您使用CodeDom动态编译F#,然后从C#执行它。

请注意,Roslyn在这里没有帮助,即使它已经发布,因为它不支持F#作为代码模型,只支持C#和VB.Net。 可能有可能使用Roslyn在F#中操作和编译C#,但不是相反。

除了Reed已经提到的选项之外,还有另外两种基于使用F#Interactive的替代方法 – 您可以将其作为单独的进程运行,也可以使用开源发行版引用它并直接调用它(虽然是非常具有挑战性的。

总而言之,您有三种选择:

  • 您可以启动fsi.exe进程并在F#Interactive环境中评估F#代码(通过标准输入将F#代码发送到进程)。 MonoDevelop的F#绑定是一个很好的例子(参见InteractiveSession.fs )。

    唯一的困难是两个进程之间的通信,但我认为这应该可以使用两者之间的.NET远程(或WCF)通道。 您也可以只读取F#Interactive的标准输出,但这可能有点过于简单。

  • 您可以使用F#编译器和工具的开源版本来引用F#编译器的相关部分并调用它们(作为库)来评估F#代码。 这将是最好的选择,它将为您提供与Roslyn的交互式C#相同的选项。

    可悲的是,这不是一件容易的事 – 我正在尝试这样做,我取得了一些进展(我可以分享),但还没有完成。 我们的想法是获取fsi.exe的源代码( 这里 ),删除所有UI并将其转换为库。

  • 使用CodeDOM,您可以调用F#编译器( fsc.exe )将F#代码编译为独立应用程序(或库),动态加载并运行它。 缺点是每次使用它时都会启动编译器的新实例,因此可能有点慢(取决于您的场景)

既然已经提出这个问题,那就有很多令人兴奋的发展:-)

您现在可以使用F#Compiler Services项目轻松完成此操作:

F#编译器服务包是从F#编译器源代码派生的组件,它公开了用于实现F#语言绑定的附加function,基于编译器或重构工具的附加工具。 该软件包还包括F#交互式服务,可用于将F#脚本嵌入到您的应用程序中。