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

时间:2013-03-04 20:12:47

标签: c# .net f# roslyn

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

3 个答案:

答案 0 :(得分:10)

目前,您必须使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#,但不是相反。

答案 1 :(得分:9)

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

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

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

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

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

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

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

答案 2 :(得分:8)

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

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

  

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