2013-12-08 31 views
7

Ho dato un'occhiata ad altre istruzioni e non ho ancora idea di come farlo. Ho due progetti (Calcolatrice in C# e Logica in F #). Ho aggiunto un riferimento alla logica in Calcolatrice, così come un riferimento alla FSharp.CoreChiamare una funzione F # da C#

Tuttavia quando aggiungo la linea

float result = Logic.start(formula); 

Nel mio progetto C#, ottengo un errore che dice:

"Il nome Logica non esiste nel contesto corrente."

C'è una logica di modulo nel progetto di logica, quindi dovrebbe essere visualizzata correttamente? Cosa mi manca ancora?

EDIT: Ecco la definizione della funzione ...

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

È necessario assicurarsi che il tipo sia pubblico e il metodo sia pubblico. Non ricordo di cosa si tratta in F #. Forse postare la definizione? –

+0

vedere seguente domanda http://stackoverflow.com/questions/478531/call-f-code-from-c-sharp – Mayank

risposta

18

Non è possibile fare riferimento da C# solo un modulo di F #, senza alcun namespace. Fare qualcosa di simile:

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

o equivalente

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

e

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

e riferimento F del progetto # da C# progetto.

UPDATE: Come JackP sottolineato, esiste l'altra alternativa, che consente di evitare l'uso di namespace esplicito su F # parte del tutto.

Quando in C# si crea una classe al di fuori di qualsiasi namespace questa classe può deferire anteponendo il suo nome con la parola chiave global contestuale seguita da :: dell'operatore, che è il modo referenziare default top-level .NET namespace. Il modulo F # con un nome semplice al di fuori di qualsiasi spazio dei nomi dal punto di vista di riferimento è equivalente a uno che ha namespace global nella prima riga di codice. L'applicazione di questa considerazione per il vostro caso si può in alternativa fare:

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

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

dettagli scabrosi su global:: accessibile MSDN.

+6

È * * può chiamare unità F #, senza uno spazio dei nomi da C# - è sufficiente per prefisso il nome del modulo/tipo con il qualificatore 'global ::': http://stackoverflow.com/questions/17113512/c-sharp-wpf-project-cannot-call-f-library/17113706#17113706 –

+0

@JackP: Grazie, Jack, per aver indicato questo percorso alternativo. Aggiornerò la mia risposta anche coprendola. –

Problemi correlati