F# 从类型提供程序动态加载程序集

F# 从类型提供程序动态加载程序集,f#,type-providers,csharpcodeprovider,F#,Type Providers,Csharpcodeprovider,我正在尝试向正在使用的类型提供程序添加一个功能,以允许用户指定类型。由于类型提供程序不能提供泛型方法,因此唯一的方法似乎是引用具有该类型的程序集 我曾尝试使用Owin库中的类型对此进行概念验证,但在尝试使用提供的类型时遇到了一个问题: 它说它找不到文件,即使它显然存在,否则我正在使用的CSharpCodeProvider将给出一个错误(它以前对不正确的文件路径执行过此操作)。我尝试在一个单独的非类型提供项目中重现这个问题,但它在那里有效 此项目的代码如下(输入类型分支): 您可以通过打开主R

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

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

它说它找不到文件,即使它显然存在,否则我正在使用的
CSharpCodeProvider
将给出一个错误(它以前对不正确的文件路径执行过此操作)。我尝试在一个单独的非类型提供项目中重现这个问题,但它在那里有效

此项目的代码如下(输入类型分支):


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

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

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

我最终不得不使用typeprovider配置(
cfg
)的
ReferenceAssembly
,如下所示:

      _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)
\u汇编解析器
让expectedName=(AssemblyName(args.Name)).Name+“.dll”
设asmPath=
cfg.referencedAssembly
|>Seq.tryFind(asmPath->IO.Path.GetFileName(asmPath)=expectedName)
匹配路径
|一些f->Assembly.LoadFrom f
|无->空)
System.AppDomain.CurrentDomain.add_assemblyResolver(_assemblyResolver)

在我的情况下很难做到这一点,因为依赖项在设计时才知道。我扩展了这个想法,让ResolveEventHandler也在父目录中查找“packages”文件夹,并在其中查找匹配的DLL。