2013-12-08 2 views
7

Я просмотрел другие инструкции и до сих пор не знаю, как это сделать. У меня есть два проекта (Калькулятор в C# и Логика в F #). Я добавил ссылку на логику в калькулятор, а также ссылку на FSharp.CoreВызов функции F # из C#

Однако, когда я добавить строку

float result = Logic.start(formula); 

В моем проекте C#, я получаю сообщение об ошибке сказав:

«Имя Логика не существует в текущем контексте».

Существует логический модуль логического проекта, поэтому он должен отображаться правильно? Что мне еще не хватает?

EDIT: Вот определение функции ...

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.

ОБНОВЛЕНИЕ: Как указано 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)... 

окровавленные детали о global:: имеющихся на MSDN.

+6

* Вы можете * позвонить F # модулей без имен из C# - вам просто нужно префикс имени модуля/типа с помощью классификатора 'global ::': http://stackoverflow.com/questions/17113512/c-sharp-wpf-project-cannot-call-f-library/17113706#17113706 –

+0

@JackP: Спасибо, Джек, за указание на этот альтернативный маршрут. Я также обновляю свой ответ, накрывая его. –

Смежные вопросы