【问题标题】:F# Type Provider dependency resolution - "Could not load file or assembly..."F# 类型提供程序依赖解析 - “无法加载文件或程序集...”
【发布时间】:2016-07-18 16:16:20
【问题描述】:

我在尝试使用我的类型提供程序时遇到“无法加载文件或程序集... ...系统找不到指定的文件”错误。

错误出现在构建消费应用程序时,但在构建之前未在 Visual Studio 中显示为“红色波浪”。

我在下面复制了我的 TP,但问题发生在 Database.listDbs 调用中,我强烈怀疑问题不是下面的代码,而是我如何打包依赖项。

我调用了 Microsoft.Azure.DocumentDB 包,该包又依赖于 Newtonsoft.Json。找不到的是 Newtonsoft.Json 包。我正在使用 Paket 来管理依赖项并启用重定向。

完整代码(包括所有 paket 文件)在 github 上:https://github.com/stewart-r/AzureDocumentDbTypeProvider/tree/dependency-issue

我发现this question 看起来非常相似,但解决方案没有任何区别。

我的TP代码如下:

namespace ProviderImplementation

open ProviderImplementation.ProvidedTypes
open Microsoft.FSharp.Core.CompilerServices
open System.Reflection
open System
open Config
open Database

[<TypeProvider>]
type public DocumentDbTypeProvider(config: TypeProviderConfig) as this = 
    inherit TypeProviderForNamespaces()

    let thisAssembly = Assembly.GetExecutingAssembly()
    let docDbType = ProvidedTypeDefinition(thisAssembly,namespaceName,"DocumentDbTypeProvider", baseType = Some typeof<obj>)

    let initFn (typeName : string) (args : obj []) = 
        let acProvidedType = ProvidedTypeDefinition(thisAssembly, namespaceName, typeName, baseType = Some typeof<obj>)
        acProvidedType.AddMember(ProvidedConstructor(parameters = [], InvokeCode = (fun args -> <@@ null @@>)))

        let getDbProperties () = 
            Database.listDbs (args.[0] :?> string) (args.[1]:?> string)
            |> List.map(fun d -> new ProvidedProperty(d.Name, typeof<string>, IsStatic = true, GetterCode = (fun _ -> <@@ "Test db name" @@>)))
        acProvidedType.AddMembers(getDbProperties())
        acProvidedType

    let parameters = 
        [ ProvidedStaticParameter("accountEndPointUri", typeof<string>, String.Empty)
          ProvidedStaticParameter("accountKey", typeof<string>, String.Empty)]

    do
        docDbType.DefineStaticParameters(parameters,initFn)
        this.AddNamespace(namespaceName,[docDbType])

[<TypeProviderAssembly>]
do ()

【问题讨论】:

    标签: f# type-providers assembly-binding-redirect paket


    【解决方案1】:

    这是一个绑定重定向问题 - 您需要在类型提供程序内部处理 BR。或者,您可以将依赖项限制为直接依赖项所需的 minimum 版本,例如文档数据库。

    【讨论】:

      【解决方案2】:

      您是否尝试过确保“TP 依赖项位于 TP 本身所在的同一文件夹中”?

      听起来您遇到了与此答案中描述的相同的问题: https://stackoverflow.com/a/33889287/371698(引用自此答案)

      【讨论】:

      • 我认为我错过了这一点 - 很多人建议我需要确保依赖项 dll 与 DLL 位于同一文件夹中,但这不是默认行为吗?没有做任何特别的事情,如果我构建 TP,TP dll 和所有 nuget 包 dll 默认都被复制到 /bin/debug 中。如果我引用该文件夹中的 TP,我仍然会收到上述错误。我错过了这里的重点吗?
      猜你喜欢
      • 2011-04-03
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2012-01-14
      • 1970-01-01
      相关资源
      最近更新 更多