为什么在创建 SqlClient 类型时会出现缺少的方法异常运行时?

Tom*_*son 5 f# type-providers f#-data assembly-binding-redirect fsharp.sqlclient

我有以下代码:

open FSharp.Data

[<Literal>]
let connectionString = @"Data Source=(local)\SQLExpress;Integrated Security=SSPI;Database=SfagStage"

type InsertEnhet = SqlCommandProvider<"Sql\InsertEnhet.sql", connectionString>

let insertEnhet (enhet:Enhet) = 
    let cmd = new InsertEnhet() // <<--- This generates an error runtime
    cmd.Execute(enhet.Navn, enhet.Enhetsnummer, enhet.LEIKode, enhet.Kommune, DateTime.Now)
Run Code Online (Sandbox Code Playgroud)

我创建命令的行是导致我认为缺少方法的原因。我认为重要的例外部分是:

System.MissingMethodException: Method not found: 'Void FSharp.Data.ISqlCommand Implementation..ctor(FSharp.Data.Connection, Int32, System.String, Boolean, System.Data.SqlClient.SqlParameter[], FSharp.Data.ResultType, FSharp.Data.ResultRank, Microsoft.FSharp.Core.FSharpFunc`2, System.String)'.
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 5

这是当您没有正确bindingRedirectFSharp.Core.dll. 查看Mark Seemann 的这篇文章。原则上,我认为将app.configwith添加bindingRedirect到您的应用程序应该可以解决问题。

在使用较新版本 FSharp.Core 的应用程序中使用针对较旧版本 FSharp.Core 编译的库时,通常会发生这种情况。.NET 运行时加载新版本的 FSharp.Core,但它不知道旧版本中的类型(如FSharpFunc)应该映射到新版本中的相应类型 - 所以你得到 MethodMissing,因为 .NET 认为这FSharpFunc是一个与加载的类型不同。(尽管类型提供程序的情况会变得更复杂一些。)

  • 我有正确的重定向,但我认为这可能是由于旧版本的 FSharp.Core。在 nuget 中升级到最新的 4.4.0.0(而不是包含在 VS 项目中的那个)为我修复了它。 (3认同)
  • 是的,每当我遇到毫无意义的奇怪错误时,我都会责怪 FSharp.Core :-) (3认同)