从 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)
我正在尝试向我正在使用的类型提供程序添加一项功能,以允许用户指定类型。 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)