FSharp.Data缺少方法异常

时间:2017-08-25 16:44:22

标签: f# f#-data missingmethodexception

我正在尝试在预编译的F#Azure函数中解析 MissingMethodException 。当我从 FSharp.Data.CssSelectorExtensions 调用扩展方法时抛出异常。

该函数在.Net Framework 4.6.2类库中定义。我使用的是当前版本的 FSharp.Core (4.2.3)和 FSharp.Data (2.3.3)。 (我已尝试过两者的旧版本,但问题仍然存在。)我已根据此类问题的标准指南为 FSharp.Core 添加了绑定重定向。代码编译干净但在执行时失败。如果我尝试直接调用扩展方法作为一个简单的静态方法,它也会失败。

非常感谢任何关于如何摆脱这种异常的指导!

功能代码

module httpfunc

open System.Net
open System.Net.Http
open Microsoft.Azure.WebJobs.Host
open FSharp.Data
open FSharp.Data.CssSelectorExtensions

let Run(req: HttpRequestMessage, log: TraceWriter) =
    async {
        let doc = HtmlDocument.Load("https://google.com")
        let node = doc.CssSelect("div.ctr-p") // <-- method is missing
        return req.CreateResponse(HttpStatusCode.OK)
    } |> Async.RunSynchronously

异常消息

 mscorlib: Exception while executing function: Functions.httpfunc. 
 mscorlib: Exception has been thrown by the target of an invocation. 
 fsfuncs: Method not found: 'Microsoft.FSharp.Collections.FSharpList`1<FSharp.Data.HtmlNode> CssSelectorExtensions.CssSelect(FSharp.Data.HtmlDocument, System.String)'.

的app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
  </startup>
  <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.4.1.0" newVersion="4.4.1.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="FSharp.Core" version="4.2.3" targetFramework="net462" />
  <package id="FSharp.Data" version="2.3.3" targetFramework="net462" />
  ...
</packages>

.fsproj

<Project ToolsVersion="15.0" ... />
  <PropertyGroup>
    <RootNamespace>fsfuncs</RootNamespace>
    <AssemblyName>fsfuncs</AssemblyName>
    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
    <TargetFSharpCoreVersion>4.4.1.0</TargetFSharpCoreVersion>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <Name>fsfuncs</Name>
  </PropertyGroup>
  ...
</Project>

修改

关于Fyodor Soikin的建议我已经确定正在加载多个版本的FSharp.Core.dll:一个来自GAC,一个来自NuGet包文件夹。

Two versions of FSharp.Core.dll are loaded.

1 个答案:

答案 0 :(得分:1)

Azure Functions后面的执行引擎已经加载FSharp.Core.dll(因为它依赖于F#编译器服务来运行你的F#脚本)而且我认为你将始终获得由{#1}}指定的版本。 execution engine's app.config,即4.4.0.0。

我可能会遗漏一些东西,但我认为你最好的机会是让你的功能使用版本4.4.0.0。您可以尝试删除明确的FSharp.Core.dll引用吗?这样,运行时应该仅加载FSharp.Core的(已预加载的)版本。