FSharp.Data丢失方法异常
我试图在预编译的F#Azure函数中解决MissingMethodException。当我从FSharp.Data.CssSelectorExtensions调用扩展方法时抛出异常。FSharp.Data丢失方法异常
该函数在.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>
编辑
在陀Soikin的意见,我已经确定了多个版本正在加载FSharp.Core.dll:一个来自GAC,一个来自NuGet软件包文件夹。
Azure的功能背后的执行引擎已加载FSharp.Core.dll
(因为它依赖于F#的编译器服务运行您的F#脚本),我认为你总是会得到一个由execution engine's app.config指定的FSharp.Core.dll
版本,这是4.4.0.0。
我可能会错过一些东西,但我认为你最好的机会是使你的函数使用版本4.4.0.0。您可以尝试删除显式的FSharp.Core
参考吗?这样,运行时应该只加载(已经预先加载的)FSharp.Core
版本。
感谢Tomas,这很有帮助。我尽我所能使用打包的'FSharp.Core',但根据Fyodor Soikin的评论,似乎绑定重定向对于类库不起作用,因此不适合编译的函数。我很欣赏指向执行引擎app.config的指针;这将使我的'FSharp.Core' GAC引用与平台版本保持同步变得更加容易。 –
我会在调试器下运行它,看看哪些模块被加载,以及是否得到两个不同版本的'FSharp.Core'副本。 –
我不知道该怎么做,不幸的是 - 据我所知,Visual Studio还没有调试器支持F#Azure函数。另外,你能帮我理解我将如何获得两个不同版本的FSharp。核心'当只有一个类库涉及?也就是说,第二个版本从哪里来? –
有一种方法可以在本地运行Azure函数,[检查出来](https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local)。不同版本可能来自非常意想不到的地方。想到的一个明显的选择是GAC。 –