从 Typeprovider 动态加载程序集

Loading assembly dynamically from a Typeprovider

我正在尝试向我正在使用的类型提供程序添加一项功能,以允许用户指定类型。 with 由​​于类型提供者无法提供泛型方法,似乎唯一的方法是引用具有该类型的程序集。

我尝试使用 Owin 库中的类型对此进行概念验证,但在尝试使用提供的类型时我 运行 遇到了问题:

它说它找不到文件,即使它显然存在,否则我使用的 CSharpCodeProvider 会给出错误(之前它已经为不正确的文件路径做过)。我试过在一个单独的非提供类型的项目中重现这个问题,但它在那里有效。

这个项目的代码在这里(输入类型分支): https://github.com/isaksky/routeprovider/tree/input-type

您可以通过打开主 RouteProvider 解决方案并调试 DebugOwin 示例来查看问题(它将为使用 RouteProvider 的示例解决方案打开 visual studio 的新实例)。

Dmitry 的解决方案是一种方法。另一种方法是简单地确保您的 TP 依赖项位于 TP 本身所在的同一文件夹中。我们将此机制用于 Azure Storage TP.

有人链接了这个答案,其中有对问题的解释和解决方案:

Type provider calling another dll in F#

我最终不得不使用 typeprovider 配置 (cfg) 的 ReferencedAssemblies,像这样:

      _assemblyResolver <- ResolveEventHandler(fun _ args ->
        let expectedName = (AssemblyName(args.Name)).Name + ".dll"
        let asmPath = 
            cfg.ReferencedAssemblies
            |> Seq.tryFind (fun asmPath -> IO.Path.GetFileName(asmPath) = expectedName)
        match asmPath with
        | Some f -> Assembly.LoadFrom f
        | None -> null)
      System.AppDomain.CurrentDomain.add_AssemblyResolve(_assemblyResolver)