使用FSharp PowerPack中的某些方法并编译为类库时System.MissingMethodException

时间:2012-08-10 18:09:59

标签: f# missingmethodexception f#-powerpack

所以我刚刚开始使用F#,我遇到了一个非常奇怪的问题,当我使用FSharp PowerPack中的某些方法时会抛出System.MissingMethodException。

同一模块中的所有方法都不会发生这种情况。如果我将程序集编译为Application而不是类库,也不会发生这种情况。

复制步骤:

  1. 创建2个程序集,一个类库和一个应用程序。
  2. 添加nunit.framework和FSharp.PowerPack DLL作为对两个程序集的引用。
  3. 在每个程序集中创建以下测试夹具。

    open NUnit.Framework
    
    [<TestFixture>]
    type Tests() = class
    
        [<Test>]
        member self.OfSeq() =
            // Will always succeed
            Matrix.Generic.ofSeq [[1]] |> ignore
    
        [<Test>]
        member self.OfList() =
            // Will fail under certain conditions with a System.MissingMethodException
            Matrix.Generic.ofList [[1]] |> ignore
    end
    
  4. 编译两个程序集。
  5. 在NUnit中打开每个程序集并运行所有测试。
  6. 当我这样做时,应用程序运行正常(所有测试都通过),但类库失败,出现以下异常:

    System.MissingMethodException : Method not found: 'Microsoft.FSharp.Math.Matrix`1<!!0> Generic.ofList(Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Collections.FSharpList`1<!!0>>)'.
       at Temp2.Tests.OfList()
    

    这里发生了什么?

    产生问题的另一种方法是matrix.PermuteColumns。

    其他信息:

    • 我正在为.NET 4.5
    • 编译两个程序集
    • 我正在使用Visual Studio 2012 RC进行编译
    • 我正在使用NUnit版本2.5.10.11092
    • 我正在使用FSharp PowerPack版本2.1.3.1(虽然DLL属性声明它是2.0.0)

    如果有其他信息可以使用,请告诉我。

2 个答案:

答案 0 :(得分:12)

(回答以后参考,因为这个Q是第一次搜索。)

使用Visual Studio 2013 ,使用Brian引用的“F#MSTest”在线项目模板,Brian的建议都没有帮助(首先,测试的目标是没有{{1的库项目}})。

但是我最终发现测试项目设置为使用F#3运行时(使用FSharp.Core V4.3.0.0)。将其更改为F#v3.1(FSharp.Core V4.3.1.0)解决了这个问题。

答案 1 :(得分:3)

我想知道这是否与绑定重定向有关。您可能需要将应用程序项目中的app.config复制到库项目。

这听起来类似于一个已知问题,我正在撰写一篇关于F#团队博客的博客文章(可能会在未来几周内出现)关于MSTest而不是NUnit。我会尝试将app.config复制到库项目中,如果这不起作用,那么请使用在线模板进行单元测试:

http://visualstudiogallery.msdn.microsoft.com/51ebe64a-899b-4959-8c24-b0148ed6b264

并从VS中的菜单中选择“TEST \ Test Settings \ Select Test Settings File”,并将其指向单元测试项目模板中包含的“MSTest.runsettings”文件。我希望这两个调整中的一个能够在MSTest案例中修复它。