3

ldtokenILメソッドを取得して、ジェネリッククラス内のジェネリックメソッドのジェネリックインスタンスをロードしようとしています(たとえば、 List.ConvertAll<TOutput>):

ldtoken method instance
    class [mscorlib]System.Collections.Generic.List`1<!!0> 
    [mscorlib]System.Collections.Generic.List`1::ConvertAll<string>(
        class [mscorlib]System.Converter`2<!0,!!0>)

これにより、例外が発生します。

未処理の例外: System.TypeLoadException: アセンブリ 'TestAssembly、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null' から型 'System.Collections.Generic.List`1' を読み込めませんでした。

System.Collections.Generic.Listで明示的に宣言されているにもかかわらず、 のテスト アセンブリを探していmscorlibます。

ただし、インスタンス化されていないメソッド トークンの読み込みは機能します。

ldtoken method instance
    class [mscorlib]System.Collections.Generic.List`1<!!0> 
    [mscorlib]System.Collections.Generic.List`1::ConvertAll<[1]>(
        class [mscorlib]System.Converter`2<!0,!!0>)

非ジェネリック クラスのジェネリック メソッドは次のように機能します。

ldtoken method void [mscorlib]System.Array::Sort<object>(!!0[])
ldtoken method void [mscorlib]System.Array::Sort<[1]>(!!0[])

どうしたの?これは .NET のバグですか? (v2 および v4 CLR で複製しました)

4

1 に答える 1

1

コメントで述べたように、ジェネリック型をインスタンス化する必要があると思います (つまり、System.Collections.Generic.List`1- justなどの型はありませんSystem.Collections.Generic.List`1<object>)。

System.Reflection.Emit をいじってみると、インスタンス化されたジェネリック型のインスタンス化されたメソッドまたはインスタンス化されていないメソッドで ldtoken を使用できるようです。

ldtoken メソッドのインスタンス
    クラス [mscorlib]System.Collections.Generic.List`1<!!0>
    クラス [mscorlib]System.Collections.Generic.List`1<オブジェクト>::ConvertAll<[1]>(
        クラス [mscorlib]System.Converter`2<!0,!!0>)
ldtoken メソッドのインスタンス
    クラス [mscorlib]System.Collections.Generic.List`1<!!0>
    クラス [mscorlib]System.Collections.Generic.List`1<オブジェクト>::ConvertAll<文字列>(
        クラス [mscorlib]System.Converter`2<!0,!!0>)

ただし、インスタンス化されていないジェネリック型ではありません。Partition II、ECMA CLI 仕様のセクション 9.4 には、次のように記載されています。

CLI は、ジェネリック型の部分的なインスタンス化をサポートしていません。また、ジェネリック型は、メタデータ シグネチャ BLOB のどこにもインスタンス化されていません。

したがって、おそらくこれは驚くべきことではありません.ldtokenを同等のものと一緒に使用する方法はないようですtypeof(List<>).GetMethod("ConvertAll").

于 2012-05-29T21:27:20.540 に答える