我创建了一个简单的生成类型提供程序,它采用重新组织类型的程序集的路径,将它们置于类型提供程序命名空间下(如果您愿意,可以说是内部化)。
相关代码的链接在这里https://github.com/colinbull/Playground https://github.com/colinbull/Playground
现在类型似乎提供正确,
let[<Literal>]assemblyPath = @"D:\Appdev\Playground\SimpleLib\bin\Debug\SimpleLib.dll"
type T = Inno.InternalisingProvider<assemblyPath>
type C = T.Class1
[<EntryPoint>]
let main argv =
let c = new C()
printfn "Result: %A" c.X
System.Console.ReadLine() |> ignore
0
因为在 VS 中显示没有任何报告的错误。但是,当我编译此程序集时,IL 似乎错误地发出,并出现以下错误。
错误 1:写入二进制文件“obj\Debug\TypeProviders.Tests.exe”时出现问题:程序类型的 pass3 中出错,错误:mref =“.ctor”的 GetMethodRefAsMethodDefIdx 中出错,错误:“Microsoft.FSharp”类型的异常.Compiler.AbstractIL.ILBinaryWriter+MethodDefNotFound' 被抛出。 FSC 1 1 TypeProviders.测试
给出的生成类型的示例样品包 http://fsharp3sample.codeplex.com/SourceControl/changeset/view/19675#354142似乎没有StaticParameters
定义,它需要返回具有所提供的类型名称的类型。在这种情况下,我如何发出提供的程序集中的类型?目前我正在做以下事情
let provideAssembly (reqType:ProvidedTypeDefinition) assemblyPath =
let name = Path.GetFileName(assemblyPath)
let providedAssembly = ProvidedAssembly.RegisterGenerated(assemblyPath)
for t in providedAssembly.GetExportedTypes() do
let ty = createGeneratedType t
ty.SetAssembly(providedAssembly)
reqType.AddMember(ty)
reqType
提前致谢
免责声明:浏览器编译的解决方案
我相信在这里您不需要创建将包装现有类型的生成类型=>这应该可以工作
let provideAssembly (reqType:ProvidedTypeDefinition) assemblyPath =
let existingAssembly = Assembly.LoadFrom(assemblyPath)
for ty in providedAssembly.GetExportedTypes() do
reqType.AddMember(ty)
reqType
你也可以尝试这个:
let provideAssembly (reqType:ProvidedTypeDefinition) assemblyPath =
reqType.AddAssemblyTypesAsNestedTypesDelayed(fun() -> Assembly.LoadFrom assemblyPath)
reqType
这个将保留命名空间,因此类型 C 的声明将如下所示
type C = T.SimpleLib.Class1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)