3

.NET Framework 4.0 では、Reflection API にいくつかの項目が導入されています。これらの項目は、非常に役立つものから私の仕事に不可欠なものまでさまざまです。これらの中には、 、 、 、および new クラスの保護されたコンストラクAssemblyターModuleMethodBodyありLocalVariableInfoますCustomAttributeData。回避するのが非常に面倒な、まだ必要なアイテムがいくつかあります。私がリストしたタイプを拡張する必要があるのと同じ [少数の] グループの人々に簡単に適用できると思います。

今回System.Reflection.Emit.OpCodeは、独自のパラメーターを使用して構造体のインスタンスを構築する方法を探しています。現在、内部コンストラクターを呼び出してインスタンスを作成しています。再利用のために構築されたアイテムをクラスのメンバーとして公開しているため、パフォーマンスに悪影響はありませんpublic static readonlyが、ご想像のとおり、これは非常に最適なシナリオではありません。

OpCode現在の内部コンストラクターを公開することがOpCodeできない理由はありますかILGenerator?

編集:これは例です。次のカスタム オペコードを作成することで、一時的なローカル変数を作成しなくても、命令の中間リスト間のバイト コード変換で使用できます。IL を出力する場合は、残りの命令を有効な IL 表現に変換しますが、私の場合、次のステップはカスタム命令swapを理解する JIT です。プレフィックスswapを使用しています。これは、有効な IL オペコードによって予約され、使用されていません。Prefix20xFD

/// <summary>
/// Swaps adjacent elements on the evaluation stack. The supplied inline int32 argument gives the
/// index of the topmost item in the pair.
/// </summary>
public static readonly OpCode Swap;

また、単純な/共通のマネージ コード表現を持たないが、さまざまなネイティブ コード ジェネレーターで使用できる単純なプラットフォーム依存の表現を持つ JIT 組み込み関数にもこれを使用します。これらの 1 つはldthread(現在のマネージ スレッドのRuntimeThread表現への参照をロードする) です。

4

2 に答える 2

0

中間結果に独自の IL オペコードを使用し、最後のステップで実際のオペコードに変換してみませんか。

于 2010-07-26T15:56:17.473 に答える
0

OpCode インスタンスはCommon Language Infrastructure (CLI) のドキュメントから厳密に派生しているため、カスタム OpCode インスタンスを作成することはできないと思います。したがって、たとえあなたのケースが理にかなっているとしても、OpCode は進むべき道ではないようです。

于 2009-12-16T09:16:39.307 に答える