2013-12-08 56 views
7

我看了其他說明,仍然不知道如何做到這一點。我有兩個項目(C#計算器和F#邏輯)。我加入計算器邏輯的引用,以及對FSharp.Core參考從C調用F#函數#

然而,當我加入一行

float result = Logic.start(formula); 

在我的C#項目,我得到一個錯誤說:

「邏輯名稱在當前上下文中不存在。」

邏輯項目中有一個模塊邏輯,所以它應該顯示正確嗎?我還缺少什麼?

編輯:這裏的函數定義...

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

您需要確保該類型是公開的且方法是公共的。我不記得我的頭頂是什麼這是在F#中。也許發佈定義? –

+0

看到以下問題 http://stackoverflow.com/questions/478531/call-f-code-from-c-sharp – Mayank

回答

18

不能從C#只是一個F#模塊是指沒有任何名稱空間。做這樣的事情:

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

或同等

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

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

和參考F#從C#項目的項目。

UPDATE:正如JackP指出的那樣,另一種選擇存在,允許避免在F#方面完全使用顯式名稱空間。

當在C#中,你的任何命名空間之外創建一類這個類可以通過global上下文關鍵字,然後::運營商,這是引用default top-level .NET namespace的方式在前面加上它的名字被稱爲。 F#模塊的名稱空間之外的簡單名稱與參考視圖之外的任何名稱空間相同,都等同於第一行代碼中具有namespace global的模塊。運用這一考慮你的情況,你可以做交替:

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

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

關於MSDN可用global::血淋淋的細節。

+6

*您可以撥打* F#模塊,而從C#中的命名空間 - 你只需要前綴模塊/類型名稱與'全局::'限定符:http://stackoverflow.com/questions/17113512/c-sharp-wpf-project-cannot-call-f-library/17113706#17113706 –

+0

@JackP:謝謝傑克指出這條路線。我會更新我的答案,並將其覆蓋。 –