14

C# で F# コードを実行する方法はありますか? C# でアプリを作成しました。F# を実行し、Record オブジェクトを読み取り、F# からリストを列挙する機能を提供したいと考えています。これに対する現在の解決策は何ですか?将来的には、Roslyn の更新によってこれを行う方法がおそらくあるでしょう。また、現在、F# で F# コードを実行する方法に興味があります。それを簡単に行う方法はありますか?

4

3 に答える 3

11

現在、F# をライブラリにしてから、C# から呼び出す必要があります。F# は単なる .NET であるため、F# ライブラリの使用は (ほとんど) 他の C# ライブラリの使用と同じです。ただし、この部分についてはFSharpXを調べることをお勧めします。これには、C# から F# を簡単に呼び出すためのユーティリティがいくつか用意されているためです。

F# を C# から動的にコンパイルする場合は、 F# Power Packの F# CodeDom 実装を使用する必要があります。これにより、CodeDom を使用して F# をオンザフライでコンパイルし、C# から実行できます。

Roslyn は、コード モデルとして F# をサポートせず、C# と VB.Net のみをサポートするため、リリースされたとしても、ここでは役に立たないことに注意してください。Roslyn を使用して F# 内から C# を操作およびコンパイルすることは潜在的に可能ですが、その逆はできません。

于 2013-03-04T20:22:51.150 に答える
10

Reed が既に述べたオプションに加えて、F# Interactive の使用に基づく 2 つの代替手段があります。別のプロセスとして実行するか、オープンソース リリースを使用して参照し、直接呼び出すことができます (これは、かなり難しいですが)。

要約すると、次の 3 つのオプションがあります。

  • プロセスを開始fsi.exeし、F# インタラクティブ環境で F# コードを評価できます (標準入力によって F# コードをプロセスに送信することにより)。MonoDevelop の F# バインディングは、これを行う方法の良い例です ( InteractiveSession.fsを参照)。

    唯一の問題は 2 つのプロセス間の通信ですが、これは 2 つのプロセス間の .NET リモート処理 (または WCF) チャネルを使用して実行できるはずです。F# Interactive から標準出力を読み取ることもできますが、それは少し単純すぎるかもしれません。

  • F# コンパイラとツールのオープン ソース リリースを使用して、 F# コンパイラの関連部分を参照し、それらを (ライブラリとして) 呼び出して F# コードを評価できます。これが最適なオプションであり、Roslyn の対話型 C# で得られるオプションとほぼ同じオプションが得られます。

    悲しいことに、これは簡単な作業ではありません。私はこれを行うというアイデアで遊んでいて、ある程度の進歩を遂げました (共有できます) が、まだ完了していません。fsi.exeアイデアは、 ( here )のソース コードを取得し、すべての UI を削除してライブラリに変換することです。

  • CodeDOM を使用すると、F# コンパイラ ( fsc.exe) を呼び出して、F# コードをスタンドアロン アプリケーション (またはライブラリ) にコンパイルし、動的にロードして実行できます。欠点は、使用するたびにコンパイラの新しいインスタンスが開始されるため、少し遅くなる可能性があることです (シナリオによって異なります)。

于 2013-03-04T20:45:40.097 に答える