【问题标题】:F# and MEF: Exporting FunctionsF# 和 MEF:导出函数
【发布时间】:2016-02-21 23:39:43
【问题描述】:

所以,我试图让这个简单的测试在 F# 控制台应用程序中运行:

open System.Reflection
open System.ComponentModel.Composition
open System.ComponentModel.Composition.Hosting

[<Export(typeof<int -> string>)>]
let toString(i: int) = i.ToString()

[<EntryPoint>]
let main argv = 
    use catalog = new AssemblyCatalog(Assembly.GetEntryAssembly())
    use container = new CompositionContainer(catalog)

    let myFunction = container.GetExportedValue<int -> string>()
    let result = myFunction(5)
    0

我希望 MEF 能够正确解决该功能,但事实并非如此。 相反,我得到了这个:

未处理的类型异常 'System.ComponentModel.Composition.CompositionContractMismatchException' 发生在 System.ComponentModel.Composition.dll

补充资料:

Cannot cast the underlying exported value of type 'Program.toString (ContractName="Microsoft.FSharp.Core.FSharpFunc(System.Int32,System.String)")' to type 'Microsoft.FSharp.Core.FSharpFunc``2[System.Int32,System.String]'.

  • 我在这里缺少什么?
  • FSharpFunc(System.Int32, System.String)FSharpFunc``2[System.Int32, System.String] 有什么区别?
  • 通过 MEF 导入/导出 F# 函数的正确方法是什么?

【问题讨论】:

    标签: f# mef


    【解决方案1】:

    编译器将顶级 F# 函数转换为方法,因此您的示例将编译为:

    [Export(FSharpFunc<int,string>)]
    public string toString(int i) { return i.ToString(); }
    

    这可能是导致错误的原因。您可以通过调用一些返回函数的操作来强制编译器生成 FSharpFunc 类型的属性获取器 - 即使是简单的标识函数也会这样做:

    let makeFunc f = f 
    
    [<Export(typeof<int -> string>)>]
    let toString = makeFunc <| fun (i:int) -> 
      i.ToString()
    

    我没有对此进行测试,但我认为它可以工作。也就是说,在这种情况下,使用简单的单方法接口可能更安全。

    【讨论】:

    • 感谢您的回复。我正试图摆脱接口。我认为我的大部分代码只需要实际的函数,而不是包含类型或任何接口的东西。
    • 另外:您提到这仅适用于顶级功能,对吗?如果我把我所有的[&lt;Export&gt;]ed 函数都作为嵌套函数呢?
    • ...啊.. 对。我无法将属性应用于嵌套函数。是否有任何类似 MEF 的库可以更好地与 F# 配合使用,同时仍然可以被 C# 代码使用?
    • 另外,我认为您应该能够使用签名文件(和签名(int -&gt; string) 而不是int -&gt; string)来实现相同的结果。
    • 作为记录,使用 Func&lt;T&gt;Action&lt;T&gt; 效果很好,虽然它不如使用原生 F# 函数语法优雅
    猜你喜欢
    • 2011-04-18
    • 2021-04-29
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多