C# 从C调用F#函数#

C# 从C调用F#函数#,c#,visual-studio,f#,C#,Visual Studio,F#,我看了其他的说明,仍然不知道怎么做。我有两个项目(C语言的计算器和F语言的逻辑)。我在计算器中添加了对逻辑的引用,以及对FSharp.Core的引用 但是当我添加行时 float result = Logic.start(formula); 在我的C#项目中,我得到一个错误,说: “当前上下文中不存在名称逻辑。” 逻辑项目中有一个模块逻辑,所以它应该显示出来,对吗?我还缺少什么 编辑:这是函数定义 let start formula = core (List.ofSeq formula) []

我看了其他的说明,仍然不知道怎么做。我有两个项目(C语言的计算器和F语言的逻辑)。我在计算器中添加了对逻辑的引用,以及对FSharp.Core的引用

但是当我添加行时

float result = Logic.start(formula);
在我的C#项目中,我得到一个错误,说:

“当前上下文中不存在名称逻辑。”

逻辑项目中有一个模块逻辑,所以它应该显示出来,对吗?我还缺少什么

编辑:这是函数定义

let start formula =
core (List.ofSeq formula) [] []
您不能仅从C#引用没有任何名称空间的F#模块。这样做:

// F# project
namespace Some
module Logic =
    let start formula =
.....
或同等品

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

参考C项目中的F项目

更新:如前所述,存在另一种选择,允许完全避免在F#端使用显式名称空间

在C#中,您在任何名称空间之外创建一个类时,可以通过在其名称前面加上
global
上下文关键字,然后加上
运算符来引用该类,这是引用的方式。从引用的角度来看,在任何名称空间之外具有简单名称的F#模块等同于在代码的第一行中具有简单名称的模块。将此考虑应用到您的案例中,您也可以:

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

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

有关
global::
的详细信息,请访问。

您需要确保类型为public,方法为public。我不记得是什么东西在F#中起作用了。也许发布定义?请参见以下问题:您可以从C调用没有命名空间的F#模块——您只需在模块/类型名称前面加上
global::
qualifier:@JackP:谢谢您,Jack,为您指明了这个替代路径。我会更新我的答案,包括它。
// F# definition
// namespace global is assumed
module Logic
let start formula =
.....

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