我创建了一个简单的生成类型提供程序,它在重组类型时采用程序集的路径,将它们置于类型提供程序命名空间下(如果您愿意,可以进行内部化)。
相关代码的链接在这里 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' 时出现问题:Program 类型的 pass3 出错,错误:mref = ".ctor" 的 GetMethodRefAsMethodDefIdx 出错,错误:'Microsoft.FSharp 类型的异常.Compiler.AbstractIL.ILBinaryWriter+MethodDefNotFound' 被抛出。FSC 1 1 TypeProviders.Tests
示例包中给出的生成类型的示例似乎没有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
提前致谢