アセンブリへのパスを取得して型を再編成し、それらを型プロバイダーの名前空間に配置する単純な生成型プロバイダーを作成しました (必要に応じて内部化のようなものです)。
関連コードへのリンクはこちら 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
前もって感謝します