C#WPF项目不能称之为F#库 [英] C# WPF Project cannot call F# library

查看:141
本文介绍了C#WPF项目不能称之为F#库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最近我花了2周的沉寂,从我目前的项目写一个体面的大小文件分析器和一个数字错误检查。我决定把它们写在F#踢和笑声。意想不到的决定。

Recently I took a 2 week hiatus from my current project to write a decent sized file parser and a numerical error checker. I decided to write them in F# for kicks and giggles. Fantastic decision.

VB编写的程序的旧版本是1000线;我在F#中管理其在170。真棒。

The older version of the program written in VB was over 1000 lines; I managed it in 170 in F#. Awesome.

我回到了我当前的项目现在想将一个F#lib中做了一些分析,也许写入/读取XML保存文件。但我似乎无法弄清楚如何从一个C#WPF应用程序为我的生活调用F#库。

I'm back on my current project now and want to incorporate an F# lib to do some parsing and maybe writing/reading an XML save file. But I cannot seem to figure out how to call an F# library from a C# WPF application for the life of me.

我使用Microsoft Visual 2010专业版,这里就是我试图迄今引用这篇文章:的 http://www.devjoy.com/2013/02/c-to-f-interop-sharing-a-domain-model/ 和一对夫妇SO帖子:

I'm using Microsoft Visual 2010 Professional, here's what I've attempted thus far referencing this article: http://www.devjoy.com/2013/02/c-to-f-interop-sharing-a-domain-model/ and a couple SO posts:

  1. 创建一个WPF项目。
  2. 在增加了一个F#库项目的解决方案。
  3. 添加引用到F#库的C#通过项目:在SolutionExplorer右键点击项目文件,单击添加引用,选择MyFSharpLib从项目选项卡,然后单击添加
  4. 然后添加一些测试code到默认的F#文件module1.fs:

  1. Create a WPF project.
  2. Added an F# library project to the solution.
  3. Added a reference to the F# library to C# project via: Right click project file in SolutionExplorer, click 'Add Reference', selected 'MyFSharpLib' from projects tab and click Add.
  4. I then added some test code to the default F# file module1.fs:

module Module1

let Add a b = a + b

  • 和试图从C#调用它:

  • And tried to call it from 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);
    }
    }
    }
    

  • 这将导致一个错误说:

    我认为这个问题是与组件。我注意到,在我见过的有使用Microsoft.FSharp.Core 一对夫妇code样本。这是我痛苦的根源?我试着将它添加,但没有找到它在.NET选项卡下。

    I think the problem is with the assemblies. I noticed in a couple code samples I've seen have using Microsoft.FSharp.Core. Is this the source of my grief? I tried adding it and couldn't find it under the .NET tab.

    这是推动我疯了,任何帮助将是非常美联社preciated。

    This is driving me crazy, any help would be much appreciated.

    推荐答案

    看来你找到了答案已经 - 构建F#项目 - 但我会提供一个答案(为后人),以一个问题,这将几乎完全一样的症状,但不同的根本原因。

    It seems you found the answer already -- building the F# project -- but I'm going to provide an answer (for posterity) to a problem which would have almost the exact same symptoms, but a different underlying cause.

    如果您所提供的完全使用例如F#code,即用一个简单的名称的模块(没有命名空间),重要的是要知道,你需要使用全球访问从C#的F#模块时的关键字。例如,这是怎么了,你不得不给你打电话从C#中定义的添加功能:

    If you use your example F# code exactly as provided, that is, a module with a simple name (without a namespace), it's important to know that you need to use the global keyword when accessing the F# module from C#. For example, this is how you'd have to call the Add function you defined from C#:

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var result = global::MyModule.Add(1, 2);
            }
        }
    }
    

    除非你有特别的理由不,它通常只是一个更好的主意,用一个命名空间的模块,例如,模块MyNamespace.Module1

    这篇关于C#WPF项目不能称之为F#库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    相关文章
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆