【问题标题】:How do you call F# methods in a PCL that return a string option, from an Xamarin Android C# project?如何从 Xamarin Android C# 项目中调用返回字符串选项的 PCL 中的 F# 方法?
【发布时间】:2016-07-06 17:26:20
【问题描述】:

如何创建可以从 C# Xamarin Android 项目调用的 F# PCL?

一些简单的东西,比如在 PCL 中:

namespace FSharpPCL2

type Class1() = 
    member this.X (s: string option) = 
      s
      |> Option.map (fun t -> t + "stuff")

尝试从 C# Xamarin Android 项目中调用它,您将收到如下编译器错误:

MainActivity.cs(26,41):错误 CS0012:类型 Microsoft.FSharp.Core.FSharpOption1' 定义在 未引用的程序集。考虑添加对 程序集`FSharp.Core,版本=3.78.3.1,文化=中性, PublicKeyToken=b03f5f7f11d50a3a'

但我不清楚您实际上是如何设法在 C# 项目中包含正确的 FSharp.Core。

【问题讨论】:

    标签: xamarin f# xamarin.android


    【解决方案1】:

    您应该查看 FSharp.Core guidelines,它解释了您在这些情况下的选项。

    在您的情况下,您可以在 C#-xamarin 项目中添加对 FSharp.Core nuget package 的包引用。 FSharp.Core, Version=3.78.3.1F# 3.1/Profile 78。您可以通过在 References > FSharp.Core > Properties 中查看版本/路径来确保引用了您想要的版本。如果没有,您可以编辑 csproj 并将路径更改为适当的版本。

    另一种方法是直接添加对随 Visual/Xamarin Studio 提供的 FSharp.Core 的引用 %PROGRAMFILES(X86)%\Reference Assemblies\Microsoft\FSharp\.NETCore\3.78.3.1\FSharp.Core.dll/Library/Frameworks/Mono.framework/Versions/4.4.1/lib/mono/Reference Assemblies/Microsoft/FSharp/.NETCore/3.78.3.1/FSharp.Core.dll

    【讨论】:

    • 事实证明,将 nuget 添加到 C# 项目中是行不通的——你只是得到了我要问的错误。
    • 如果可以将 FSharp.Core 的 PCL 版本添加到 C# 项目(而不是您可能认为正确的那个),您几乎肯定不想这样做,因为这可能会破坏您包含的其他非 PCL F# 项目(如果您尝试包含使用 printfn 的 F# 项目会发生什么,例如,如果您的最终项目尝试仅使用 PCL FSharp.Core)
    • 我已经编辑了我的答案并添加了一个替代方案,使用与 VS/XS 一起安装的 FSharp.Core 程序集而不是 nuget 包。关于 nuget 包,您是否添加了正确版本的包? 3.78.3.1 表示 F# 3.1。最后是的,有许多引用不同 FSharp.Core 的项目会破坏事情;但最终它可以用binding redirects 修复到最高版本,在实际运行的应用程序上。 FSharp.Core 实现是二进制兼容的。
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多