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

时间:2015-10-13 14:31:47

标签: 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)

我创建命令的行是导致我想到的丢失方法的原因。我认为重要的例外是:

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)'.

1 个答案:

答案 0 :(得分:4)

当您对bindingRedirect没有正确的FSharp.Core.dll时,可能会遇到这种情况。查看this article by Mark Seemann。原则上,我认为将app.configbindingRedirect添加到您的应用程序应该可以解决问题。

在使用较新版本的FSharp.Core的应用程序中使用针对旧版FSharp.Core编译的库时,通常会发生这种情况。 .NET运行时加载了新版本的FSharp.Core,但它不知道旧版本中的类型(如FSharpFunc)应该映射到新版本中的相应类型 - 因此你得到MethodMissing,因为。 NET认为FSharpFunc与加载的类型不同。 (虽然类型提供者的情况有点复杂。)