最近,我从我当前的项目中休息了2周,编写了一个体面的文件解析器和一个数字错误检查器。我决定用F#写它们,因为踢腿和咯咯笑。神奇的决定。
用VB编写的旧版程序超过1000行;我在F#中用170管理它。真棒。
我现在回到我当前的项目,并希望合并一个F#lib来进行一些解析,并可能编写/读取XML保存文件。但我似乎无法弄清楚如何在C#WPF应用程序中调用F#库来维持生命。
我正在使用Microsoft Visual 2010 Professional,这是我到目前为止参考这篇文章的尝试:http://www.devjoy.com/2013/02/c-to-f-interop-sharing-a-domain-model/ 和几个SO帖子:
然后我将一些测试代码添加到默认的F#文件module1.fs:
module Module1
let Add a b = a + b
并试图从C#中调用它:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
// Call F# library
private void Button_Click(object sender, RoutedEventArgs e)
{
int a = Module1.Add(1, 2);
}
}
}
这导致错误说:“当前上下文中不存在名称'Module1'。”
我认为问题在于装配体。我注意到我看到的几个代码示例中有using Microsoft.FSharp.Core
。这是我悲伤的根源吗?我尝试添加它,但无法在.NET选项卡下找到它。
这让我发疯,任何帮助都会非常感激。
答案 0 :(得分:5)
似乎你已经找到了答案 - 构建F#项目 - 但是我将为一个问题提供一个答案(后代),这个问题几乎具有完全相同的症状,但却有不同的根本原因。 / p>
如果您使用完全按照提供的示例F#代码,即具有简单名称(没有命名空间)的模块,则在访问F#模块时需要使用global
关键字非常重要来自C#。例如,这是您必须调用从C#定义的Add
函数的方法:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var result = global::MyModule.Add(1, 2);
}
}
}
除非您有特殊原因,否则在您的模块中使用命名空间通常更好一点,例如module MyNamespace.Module1
。