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

Bud*_*Joe 12 .net c# f# roslyn

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

Ree*_*sey 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#,但不是相反.


Tom*_*cek 9

除了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#compiler(fsc.exe)将F#代码编译为独立的应用程序(或库),动态加载并运行它.缺点是每次使用它时都会启动编译器的新实例,因此可能有点慢(取决于您的场景)


Tom*_*cek 8

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

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

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