F#类型提供程序依赖项解析 - "无法加载文件或程序集..."

时间:2016-07-17 09:52:33

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

我遇到了一个"无法加载文件或程序集...... ...系统找不到指定的文件"尝试使用我的类型提供程序时出错。

构建消费应用程序时出现错误,但不会显示为“红色波浪形”。在构建之前的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 ()

2 个答案:

答案 0 :(得分:1)

这是绑定重定向问题 - 您需要处理类型提供程序中的BR 。或者,您可以将依赖项限制为直接依赖项所需的最小版本,例如: DocumentDB。

答案 1 :(得分:0)

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

听起来你有与本回答中描述的相同的问题: https://stackoverflow.com/a/33889287/371698(引自这个答案)