Подтвердить что ты не робот

Запустить код F # в С# - (как С# в С# с использованием Roslyn)

Есть ли способ запустить код F # в С#? Я написал приложение на С# - я хотел бы предоставить ему возможность выполнять F #, читать записи объектов, перечислять списки из F #. Каково нынешнее решение для этого? Я знаю, что в будущем, вероятно, будет возможность сделать это через обновление до Roslyn. Также любопытно, как запустить код F # в F #, в настоящее время. Есть ли способ сделать это легко?

4b9b3361

Ответ 1

В настоящее время вы должны создать библиотеку F #, а затем вызвать ее из С#. Поскольку F # - это просто .NET, использование библиотеки F # (в основном) аналогично использованию любой другой библиотеки С#. Возможно, вы захотите изучить FSharpX для этой части, поскольку она предоставляет некоторые утилиты для облегчения вызова F # из С# и наоборот.

Если вы хотите скомпилировать F # динамически с С#, вам нужно использовать реализацию F # CodeDom из F # Power Pack. Это позволит вам использовать CodeDom для компиляции F # на лету, а затем выполнить его с С#.

Обратите внимание, что Roslyn не поможет здесь, даже когда он будет выпущен, поскольку он не будет поддерживать F # в качестве модели кода, только С# и VB.Net. Возможно, было бы возможно использовать Roslyn для манипулирования и компиляции С# из F #, но не наоборот.

Ответ 2

В дополнение к вариантам, которые уже упоминал Рид, существуют две другие альтернативы, основанные на использовании F # Interactive - вы можете запускать его как отдельный процесс или использовать версию с открытым исходным кодом для ссылки на нее и называть ее (что довольно сложно).

Итак, у вас есть три варианта:

  • Вы можете запустить процесс fsi.exe и оценить код F # в среде F # Interactive (путем отправки кода F # в процесс стандартным вводом). Связывание F # для MonoDevelop - хороший пример, как это сделать (см. InteractiveSession.fs).

    Единственная трудность заключается в связи между двумя процессами, но я думаю, что это должно выполняться с использованием канала удаленного доступа .NET(или WCF) между ними. Вы также можете просто прочитать стандартный вывод из F # Interactive, но это может быть слишком просто.

  • Вы можете использовать выпуск с открытым исходным кодом компилятор F # и инструменты для ссылки на соответствующие части компилятора F # и вызвать их ( как библиотека) для оценки кода F #. Это был бы лучший вариант, и это дало бы вам практически то же самое, что вы получили с интерактивным С# из Roslyn.

    К сожалению, это не совсем легкая задача - я играл с идеей сделать это, и я сделал некоторый прогресс (я могу поделиться этим), но это еще не сделано. Идея состоит в том, чтобы взять исходный код fsi.exe (здесь), удалить весь пользовательский интерфейс и превратить его в библиотеку.

  • Используя CodeDOM, вы можете вызывать компилятор F # (fsc.exe) для компиляции кода F # в автономное приложение (или библиотеку), загружать его динамически и запускать. Недостатком является то, что каждый раз, когда вы его используете, он запускает новый экземпляр компилятора, поэтому он может быть немного медленным (зависит от вашего сценария).

Ответ 3

Поскольку вопрос задан, было много интересных событий: -)

Теперь вы можете сделать это очень легко, используя F # Compiler Services:

Пакет служб компилятора F # представляет собой компонент, полученный из исходного кода компилятора F #, который предоставляет дополнительные функции для реализации привязок языка F #, дополнительных инструментов на основе компилятора или инструментов рефакторинга. Пакет также включает интерактивную службу F #, которая может использоваться для встраивания скриптов F # в ваши приложения.