从C#项目中消耗F#:获取未找到的方法"

时间:2016-05-07 19:11:02

标签: f# assembly-binding-redirect

我在F#项目中定义了一个.NET类:

for x1 in range(a**l):
    for x2 in range(a**l):
        for x3 in range(a**l):
            output[x1,x2,x3] = HeavyComputationThatIsThreadSafe1(x1,x2,x3)

当我尝试从C#单元测试项目和ASP.NET应用程序运行它时,我得到了这个:

  

找不到方法:   ' Microsoft.FSharp.Control.FSharpAsync`1

此类还有另外一种使用

的方法
type public StockAnalyzer() = 
    member public this.GetStockClose ticker = 
        try
            let stockInfo = YahooContext.Load("http://ichart.finance.yahoo.com/table.csv?s=" + ticker)
            let mostRecent = stockInfo.Rows |> Seq.head
            (float)mostRecent.``Adj Close``
        with 
            | :?  System.Net.WebException -> -1.0

是否导致interop在异步上失败?即使我甚至没有调用那种方法?

1 个答案:

答案 0 :(得分:1)

为了扩展Fyodor Soikin在评论中所说的内容,这通常是由于单元测试项目与您尝试测试的任何内容之间的FSharp.Core版本不匹配而导致的。

您可以创建绑定重定向,将引用重定向到不同版本的FSharp.Core。您可以通过在项目中创建App.config文件来执行此操作,它应如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    ...
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
          <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.1.0" />
        </dependentAssembly>
      </assemblyBinding>
    </runtime>
</configuration>

请参阅:https://fsharp.github.io/2015/04/18/fsharp-core-notes.html#use-binding-redirects-for-applications

该页面显然对FSharp.Core上可能需要的其他信息也很有用。

P.S。请注意版本号。实际上,您可能需要重定向到FSharp.Core版本4.4.0.0(F#4.0)