【问题标题】:Emitting Generated Types in F# type providers在 F# 类型提供程序中发出生成的类型
【发布时间】:2013-03-02 18:26:15
【问题描述】:

我创建了一个简单的生成类型提供程序,它采用程序集的路径重新组织类型,将它们置于类型提供程序命名空间下,(如果您愿意,可以进行内部化)。

相关代码的链接在这里 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.Tests

samples pack 中给出的生成类型的示例似乎没有定义任何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

提前致谢

【问题讨论】:

    标签: f# type-providers f#-3.0


    【解决方案1】:

    免责声明:浏览器编译解决方案

    我相信在这里您不需要创建将包装现有类型的生成类型 => 这应该可以工作

    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
    

    【讨论】:

    • 天哪,我太愚蠢了,我首先尝试过,但是在我的代码中直接引用了生成的类型,所以我得到了编译错误。教训不 -> 正确阅读错误消息。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多