在CoreCLR中运行F#

我按照这里描述编译了CoreCLR和CoreFX 。 基本上,我可以编译和运行针对CoreCLR的C#代码。
下一步是尝试编译和运行F#代码。 所以我将FSharp.Core 3.1.2.1添加到项目中,并使用以下命令编译了一个示例应用程序:

fsc ^ --noframework ^ --targetprofile:netcore ^ /r:packages\System.Runtime.4.0.20-beta-22703\lib\contract\System.Runtime.dll ^ /r:packages\System.Reflection.4.0.10-beta-22703\lib\contract\System.Reflection.dll ^ /r:packages\System.Collections.4.0.10-beta-22703\lib\contract\System.Collections.dll ^ /r:packages\System.Diagnostics.Debug.4.0.10-beta-22703\lib\contract\System.Diagnostics.Debug.dll ^ /r:packages\System.IO.FileSystem.4.0.0-beta-22703\lib\contract\System.IO.FileSystem.dll ^ /r:packages\System.Linq.Expressions.4.0.10-beta-22703\lib\contract\System.Linq.Expressions.dll ^ /r:packages\System.Console.4.0.0-beta-22703\lib\contract\System.Console.dll ^ /r:packages\System.Runtime.Extensions.4.0.10-beta-22703\lib\contract\System.Runtime.Extensions.dll ^ /r:packages\System.Runtime.InteropServices.4.0.20-beta-22703\lib\contract\System.Runtime.InteropServices.dll ^ /r:packages\System.Text.Encoding.4.0.10-beta-22703\lib\contract\System.Text.Encoding.dll ^ /r:packages\System.Text.RegularExpressions.4.0.10-beta-22703\lib\contract\System.Text.RegularExpressions.dll ^ /r:packages\System.Threading.Overlapped.4.0.0-beta-22703\lib\contract\System.Threading.Overlapped.dll ^ /r:packages\System.Threading.ThreadPool.4.0.10-beta-22703\lib\contract\System.Threading.ThreadPool.dll ^ /r:packages\FSharp.Core.3.1.2.1\lib\portable-net45+netcore45+MonoAndroid1+MonoTouch1\FSharp.Core.dll ^ /out:runtime\HelloWorld.exe HelloWorld.fs 

正如您所看到的,我构建了FSharp.Core的Profile7。 当我运行应用程序时,语句let test = sprintf "Hello, world"失败,出现以下exception:

 Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies. The system cannot find the file specified. at Microsoft.FSharp.Core.PrintfImpl.PrintfBuilderStack..ctor() at Microsoft.FSharp.Core.PrintfImpl.PrintfBuilder`3..ctor() at Microsoft.FSharp.Core.PrintfImpl.Cache`4.generate(String fmt) at Microsoft.FSharp.Core.PrintfImpl.f@4277-43[T,TState,TResidue,TResult](String key, Unit unitVar0) at Microsoft.FSharp.Core.PrintfImpl.Cache`4.get(String key) at Microsoft.FSharp.Core.PrintfImpl.Cache`4.Get(PrintfFormat`4 key) at Microsoft.FSharp.Core.PrintfModule.PrintFormatToStringThen[TResult,T](FSharpFunc`2 continutation, PrintfFormat`4 format) at HelloWorld.main(String[] args) 

我在这里也讨论了这个,但我无法弄清楚我做错了什么。 我是否包含错误版本的FSharp.Core? Profile7 应该工作 。

在撰写本文时(2015年4月),F#尚未移植到完全支持CoreCLR / CoreFX。

CoreCLR和CoreFX目前正在进行大量的更改和改进,同时开发仍在进行中。 在接下来的几个月里,流失率将会下降,稳定性会迅速提升,但此时在CoreCLR / FX上建立任何实质性的东西都类似于在流沙上建造一座摩天大楼。

目前用于在[LI | U] N [U | I] X上构建和运行F#的Mono v.next也正在进行大量更改,因为它用程序集和代码替换了Mono平台和Framework的大块来自CoreCLR和CoreFX。

您可能希望跟踪Visual F#issue#387以获取进度。

您可能还想跟踪Visual F#issue#336 ,它讨论了在CoreCLR上支持F#以进行x-plat工作。

UPDATE1:

现在F#4.0发布了,团队正在开展一系列新工作: https : //github.com/Microsoft/visualfsharp/issues/563

这些工作项中的关键是向F#添加CoreCLR支持: https : //github.com/Microsoft/visualfsharp/issues/499 。