有没有办法在 C# 中运行 F# 代码?我用 C# 编写了一个应用程序 - 我想为其提供执行 F#、读取 Record 对象、从 F# 枚举列表的能力。目前的解决方案是什么?我知道将来可能会有办法通过更新 Roslyn 来做到这一点。另外,好奇目前如何在 F# 中运行 F# 代码。有没有办法轻松做到这一点?
3 回答
目前,您必须将 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
(here)的源代码,删除所有UI并将其变成一个库。使用 CodeDOM,您可以调用 F# 编译器 (
fsc.exe
) 将 F# 代码编译为独立的应用程序(或库),动态加载并运行它。一个缺点是每次使用它都会启动一个新的编译器实例,所以它可能有点慢(取决于你的场景)
自从提出问题以来,已经有了很多令人兴奋的发展:-)
您现在可以使用F# Compiler Services项目非常轻松地做到这一点:
F# 编译器服务包是从 F# 编译器源代码派生的组件,它公开了用于实现 F# 语言绑定的附加功能、基于编译器的附加工具或重构工具。该包还包括 F# 交互式服务,可用于将 F# 脚本嵌入到您的应用程序中。