そのため、最近いくつかの実験を行ったところ、Reflection.Emit が ECMA 仕様のすべてのオペコードをサポートしていないことがわかりました。欠落している 3 つのオペコードがあります。
ldelem.any
stelem.any
no.
(プレフィックス)
これらのオペコードは、Reflection API でサポートされていないだけですか?それとも、それらを生成する方法などはありますか?
そのため、最近いくつかの実験を行ったところ、Reflection.Emit が ECMA 仕様のすべてのオペコードをサポートしていないことがわかりました。欠落している 3 つのオペコードがあります。
ldelem.any
stelem.any
no.
(プレフィックス)これらのオペコードは、Reflection API でサポートされていないだけですか?それとも、それらを生成する方法などはありますか?
実際、できます。
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
ページのドロップダウンでは、それを実行できるフレームワークの多くのバージョンを選択できます。
私はこれについてコメントしましたが、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 で操作する必要があることを検証者に伝えます。