2013-12-08 10 views
7

私は他の指示を見てきましたが、これを行う方法はまだ分かりません。私は2つのプロジェクトを持っています(Calculator in C#とLogic in F#)。私は私のC#プロジェクトではラインC#からF#関数を呼び出す

float result = Logic.start(formula); 

を追加するとき、私は、私はエラーが言ってもらう電卓でロジックを参照するだけでなく、

しかしFSharp.Coreへの参照を追加しました:

"Logicという名前は現在のコンテキストに存在しません。"

ロジックプロジェクトにモジュールロジックがあるので、正しく表示されるはずですか?私はまだ何が欠けていますか?

編集:ここでは、任意の名前空間なしでちょうどF#のモジュールのC#から参照することができない関数定義...

let start formula = 
core (List.ofSeq formula) [] [] 
+0

タイプがpublicで、メソッドがpublicであることを確認する必要があります。私は頭の上からF#でこれを行うことを覚えていません。おそらく定義を投稿しますか? –

+0

質問以下を参照してください あなたは* *のC#から名前空間なしのF#モジュールを呼び出すことができますhttp://stackoverflow.com/questions/478531/call-f-code-from-c-sharp – Mayank

答えて

18

です。 C#プロジェクトから

// F# project 
namespace Some 
module Logic = 
    let start formula = 
..... 

または同等

// F# project 
module Some.Logic 
let start formula = 
..... 

// C# project 
..... 
Some.Logic.start(formula) 

およびリファレンスF#プロジェクト:このような何かを行います。

更新::JackPが指摘したように、F#側の明示的な名前空間の使用を避けることを可能にする別の方法が存在します。

C#で使用すると、このクラスの任意の名前空間の外でクラスを作成default top-level .NET namespaceを参照する方法です::オペレータ、続いglobalコンテンツキーワードでその名を付加することで参照することができます。参照の観点からの名前空間の外に単純な名前を持つF#モジュールは、コードの最初の行にnamespace globalを持つものと同等です。あなたが代わりに行うことができますあなたの場合には、この考察を適用する:MSDNで利用可能global::について

// F# definition 
// namespace global is assumed 
module Logic 
let start formula = 
..... 

// C# reference 
...global::Logic.start(formula)... 

Goryの詳細を。

+6

- あなただけに必要モジュール/タイプ名の前に 'global ::'修飾子を付けます:http://stackoverflow.com/questions/17113512/c-sharp-wpf-project-cannot-call-f-library/17113706#17113706 –

+0

@JackP:この代替ルートを指してくれてありがとう、ジャック。私はそれをカバーして私の答えを更新します。 –

関連する問題