Запуск F# в CoreCLR


Я скомпилировал CoreCLR и CoreFX, как описано здесь. В принципе, это работает, и я могу компилировать и запускать C# - код, ориентированный на CoreCLR.
Следующим шагом была попытка компиляции и запуска кода F#. Поэтому я добавил FSharp.Ядро 3.1.2.1 к проекту и скомпилировало образец приложения, используя следующую команду:

fsc ^
--noframework ^
--targetprofile:netcore ^
/r:packagesSystem.Runtime.4.0.20-beta-22703libcontractSystem.Runtime.dll ^
/r:packagesSystem.Reflection.4.0.10-beta-22703libcontractSystem.Reflection.dll ^
/r:packagesSystem.Collections.4.0.10-beta-22703libcontractSystem.Collections.dll ^
/r:packagesSystem.Diagnostics.Debug.4.0.10-beta-22703libcontractSystem.Diagnostics.Debug.dll ^
/r:packagesSystem.IO.FileSystem.4.0.0-beta-22703libcontractSystem.IO.FileSystem.dll ^
/r:packagesSystem.Linq.Expressions.4.0.10-beta-22703libcontractSystem.Linq.Expressions.dll ^
/r:packagesSystem.Console.4.0.0-beta-22703libcontractSystem.Console.dll ^
/r:packagesSystem.Runtime.Extensions.4.0.10-beta-22703libcontractSystem.Runtime.Extensions.dll ^
/r:packagesSystem.Runtime.InteropServices.4.0.20-beta-22703libcontractSystem.Runtime.InteropServices.dll ^
/r:packagesSystem.Text.Encoding.4.0.10-beta-22703libcontractSystem.Text.Encoding.dll ^
/r:packagesSystem.Text.RegularExpressions.4.0.10-beta-22703libcontractSystem.Text.RegularExpressions.dll ^
/r:packagesSystem.Threading.Overlapped.4.0.0-beta-22703libcontractSystem.Threading.Overlapped.dll ^
/r:packagesSystem.Threading.ThreadPool.4.0.10-beta-22703libcontractSystem.Threading.ThreadPool.dll ^
/r:packagesFSharp.Core.3.1.2.1libportable-net45+netcore45+MonoAndroid1+MonoTouch1FSharp.Core.dll ^
/out:runtimeHelloWorld.exe HelloWorld.fs

Как вы можете видеть, я построил против Profile7 FSharp.Ядро. Когда я запускаю приложение, оператор let test = sprintf "Hello, world" завершается с ошибкой следующее исключение:

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.Ядро? Profile7 должен работать .

1 8

1 ответ:

На момент написания статьи (апрель 2015 г.) F# еще не был портирован для полной поддержки CoreCLR / CoreFX.

CoreCLR иCoreFX в настоящее время претерпевают множество изменений и улучшений по мере развития. Отток будет уменьшаться, а стабильность быстро улучшаться в ближайшие месяцы, но строить что-либо существенное на CoreCLR/FX в это время будет сродни строительству небоскреба на зыбучих песках.

Mono v. next, который в настоящее время используется для сборки и запуска F# на [LI|U]N[U / I]X также претерпевает значительные изменения, поскольку заменяет большие куски Моноплатформы и фреймворка сборками и кодом из CoreCLR и CoreFX.

Возможно, вы захотите отслеживать Visual F# issue #387 для прогресса.

Вы также можете отслеживатьVisual F# issue #336 , в котором обсуждается поддержка F# на CoreCLR для работы x-plat.

Update1:

Теперь, когда F# 4.0 поставляется, команда работает над кучей новых работ: https://github.com/Microsoft/visualfsharp/issues/563

Ключевым среди этих рабочих элементов является добавление поддержки CoreCLR в F#: https://github.com/Microsoft/visualfsharp/issues/499 .