2013-02-25 3 views
3

J'ai créé un fournisseur de type générateur simple qui prend le chemin d'un assemblage pour réorganiser les types, pour les placer sous l'espace de noms des fournisseurs de type (sorte d'internalisation si vous le souhaitez).Emission de types générés dans les fournisseurs de type F #

Le lien vers le code en question est ici https://github.com/colinbull/Playground

Maintenant, les types semblent être fournis correctement,

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 

depuis les écrans dans VS sans erreurs signalées. Cependant, lorsque je compile cet assembly, IL semble être émis incorrectement avec l'erreur suivante.

Error 1: A problem occurred writing the binary 'obj\Debug\TypeProviders.Tests.exe': Error in pass3 for type Program, error: Error in GetMethodRefAsMethodDefIdx for mref = ".ctor", error: Exception of type 'Microsoft.FSharp.Compiler.AbstractIL.ILBinaryWriter+MethodDefNotFound' was thrown. FSC 1 1 TypeProviders.Tests

Les exemples donnés pour les types générés donnés dans samples pack ne semble pas avoir de StaticParameters défini qui nécessite un type avec le nom du type prévu à renvoyer. Dans ce cas, comment puis-je émettre les types dans l'assemblage fourni? Actuellement, je fais ce qui suit

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 

Merci à l'avance

Répondre

4

Disclaimer: compilation de solutions de navigateur

Je crois ici que vous n'avez pas besoin de créer des types générés qui termineront la sortie de types => cela devrait fonctionner

let provideAssembly (reqType:ProvidedTypeDefinition) assemblyPath = 
    let existingAssembly = Assembly.LoadFrom(assemblyPath) 

    for ty in providedAssembly.GetExportedTypes() do 
     reqType.AddMember(ty) 

    reqType 

Vous pouvez également essayer celui-ci:

let provideAssembly (reqType:ProvidedTypeDefinition) assemblyPath = 
    reqType.AddAssemblyTypesAsNestedTypesDelayed(fun() -> Assembly.LoadFrom assemblyPath) 
    reqType 

celui-ci conservera donc namespace déclaration de type C ressemblera

type C = T.SimpleLib.Class1 
+0

Dieu, je suis tellement stupide, je l'avais essayé, mais d'abord mettre une référence directe au type généré dans mon code, donc je recevais alors des erreurs de compilation. Lesson learn't -> lire correctement les messages d'erreur. Merci encore –

Questions connexes