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 に答える