2013-03-04 12 views
11

Czy istnieje sposób, aby uruchomić kod F # w C#? Napisałem aplikację w języku C# - Chciałbym umożliwić jej wykonywanie F #, odczytywanie obiektów Record, wyliczanie list z F #. Jakie jest obecne rozwiązanie tego problemu? Wiem, że w przyszłości będzie prawdopodobnie sposób na zrobienie tego poprzez aktualizację Roslyn. Również ciekawy jak uruchomić kod F # w F #, obecnie. Czy można to łatwo zrobić?Uruchom F # kod w C# - (jak C# w C# za pomocą Roslyn)

Odpowiedz

9

Obecnie musisz zrobić F # biblioteka, a następnie wywołać ją z C#. Ponieważ F # jest po prostu .NET, korzystanie z biblioteki F # jest (głównie) tak jak przy użyciu dowolnej innej biblioteki C#. Warto jednak zajrzeć do tej części w FSharpX, ponieważ zapewnia ona pewne narzędzia ułatwiające wywołanie F # z C# i na odwrót.

Jeśli chcesz kompilować F # dynamicznie z C#, będziesz musiał użyć implementacji F # CodeDom z F# Power Pack. Umożliwi to użycie CodeDom do kompilowania F # w locie, a następnie wykonanie go z C#.

Pamiętaj, że Roslyn nie pomoże tutaj, nawet gdy zostanie zwolniony, ponieważ nie będzie obsługiwał F # jako modelu kodu, tylko C# i VB.Net. Byłoby możliwe wykorzystanie Roslyn do manipulowania i kompilowania C# z poziomu F #, ale nie na odwrót.

8

Oprócz opcji, o których wspomniała już Reed, istnieją dwie inne alternatywy oparte na użyciu Interaktywnego F # - możesz uruchomić go jako oddzielny proces lub użyć wydania open-source do odwołania się do niego i wywołania bezpośrednio (co jest dość trudne).

Tak w skrócie, masz trzy opcje:

  • można rozpocząć proces fsi.exe i oceny F # Kod w środowisku F # Interactive (wysyłając F # Kod do procesu standardowego wejścia). Wiązanie F # dla MonoDevelop jest dobrym przykładem, jak to zrobić (patrz InteractiveSession.fs).

    Jedyną trudnością jest komunikacja między tymi dwoma procesami, ale myślę, że powinno to być możliwe do wykonania za pomocą kanału zdalnego .NET (lub WCF) między tymi dwoma procesami. Możesz także po prostu odczytać standardowe wyjście z F # Interactive, ale może to być trochę zbyt proste.

  • Możesz użyć open-source'owej wersji F# compiler & tools, aby odnieść się do odpowiednich części kompilatora F # i wywołać je (jako bibliotekę), aby ocenić kod F #. Byłaby to najlepsza opcja, która dałaby ci prawie takie same opcje, jakie oferuje interaktywny C# z Roslyn.

    Niestety, nie jest to łatwe zadanie - bawiłem się z pomysłem zrobienia tego i zrobiłem pewien postęp (mogę się tym dzielić), ale to jeszcze nie koniec. Chodzi o to, aby pobrać kod źródłowy z fsi.exe (here), usunąć cały interfejs i przekształcić go w bibliotekę.

  • Za pomocą CodeDOM można wywołać kompilator F # (fsc.exe), aby skompilować kod F # do samodzielnej aplikacji (lub biblioteki), załadować go dynamicznie i uruchomić.Wadą jest to, że spowoduje to uruchomienie nowej instancji kompilatora przy każdym użyciu i może być nieco powolne (w zależności od twojego scenariusza).
7

Od czasu, gdy zadawano pytanie, było dużo od ekscytującego rozwoju :-)

teraz można to zrobić bardzo łatwo za pomocą projektu F# Compiler Services:

F # usługi kompilatora pakiet jest elementem pochodzi z kodem źródłowym F # kompilatora, że ​​naraża dodatkowe funkcje wykonawcze do F # powiązania językowe, dodatkowe narzędzia oparte na kompilatorze lub refaktoryzacji narzędzia. Pakiet zawiera również interaktywną usługę F #, która może być używana do osadzania skryptów F # w twoich aplikacjach.