8

そのため、最近いくつかの実験を行ったところ、Reflection.Emit が ECMA 仕様のすべてのオペコードをサポートしていないことがわかりました。欠落している 3 つのオペコードがあります。

  • ldelem.any
  • stelem.any
  • no.(プレフィックス)

これらのオペコードは、Reflection API でサポートされていないだけですか?それとも、それらを生成する方法などはありますか?

4

2 に答える 2

1

実際、できます。

http://msdn.microsoft.com/en-us/library/4xxf1410.aspxにすばらしいウォークスルーがあります。

2つの重要な部分は次のとおりです。

ジェネリックパラメーターを作成します。

string[] typeParamNames = {"TFirst", "TSecond"};
GenericTypeParameterBuilder[] typeParams = 
    myType.DefineGenericParameters(typeParamNames);

GenericTypeParameterBuilder TFirst = typeParams[0];
GenericTypeParameterBuilder TSecond = typeParams[1];

次に、メソッドを作成します。

Type listOf = typeof(List<>);
Type listOfTFirst = listOf.MakeGenericType(TFirst);
Type[] mParamTypes = {TFirst.MakeArrayType()};

MethodBuilder exMethod = 
    myType.DefineMethod("ExampleMethod", 
        MethodAttributes.Public | MethodAttributes.Static, 
        listOfTFirst, 
        mParamTypes);

ただし、ジェネリックパラメーターは非常に多くの異なる方法とセクションで使用されるため(メソッド、パラメーター、結果タイプ、呼び出し時など)、完全に理解する必要があります。

-更新-および.NET2固有のバージョンが必要な場合:http://msdn.microsoft.com/en-us/library/4xxf1410%28v=vs.80%29.aspx

ページのドロップダウンでは、それを実行できるフレームワークの多くのバージョンを選択できます。

于 2012-11-21T16:31:19.000 に答える
0

私はこれについてコメントしましたが、OpCode.Stelem少なくとも.net 4の指示はaに変換されますstelem.any

配列に格納している型をエンコードする必要があり、プリミティブにはさまざまなstelem.*オペコードがあったことがよくありました。参照型 (デリゲートまたはクラスとして宣言されたもの) を格納する場合は、値型 (構造体または列挙型として宣言されたもの) をstelem.Ref使用します。Stelem (myType)

ただし、ジェネリックの出現により、型パラメーターが登場し、必要なものは何でもかまいません。T参照型または値型である可能性があります。だからstelem.any、この異常なケースを処理するために生まれました。しかし、ボックス化されていない T を T 配列に格納することしかできないので、まったく無意味であり、配列の型に頼ることはできないと言うかもしれません。

配列の型もジェネリックである可能性があり、これは物事をかなり難しくします。しかし、もっと重要なことは、その逆の操作が次の操作の検証にも役立つことです。

ldarg.0
ldc.i4.0
ldelem.any !!T

このスタック遷移後の次の命令は、ジェネリック メソッド パラメーターであるボックス化されていない T で操作する必要があることを検証者に伝えます。

于 2013-01-12T19:14:34.550 に答える