4

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

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

提前致谢

4

1 回答 1

4

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

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

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
于 2013-02-26T01:09:42.333 回答