動的メソッドは、変数に通常アクセスできる場所で変数にアクセスし、メソッドを呼び出し、変数を初期化できるという点で、通常のメソッドまたはコードのように機能しますか(もちろんメソッドのスコープ内で)?
私が見た唯一の例は、いくつかのパラメーターが渡され、いくつかの値を返し、それ以外の変数を変更することは何もしない場合です。
System.Reflection.Emit.DynamicMethodクラスについて話しています。まだよくわからないMSILを使う必要があるので理解に苦労しています。
はい。DynamicMethodはクラスにアタッチできます。その場合、クラスプライベート静的フィールドにアクセスできます(DynamicMethodがインスタンスメソッドの場合はクラスプライベートフィールドにアクセスできますが、サポートされているシナリオかどうかは思い出せません)。また、DynamicMethodが作成されたアセンブリの内部にあるアセンブリ内部のメソッド、プロパティ、およびタイプにアクセスすることもできます。
動的メソッドを使用しているシナリオは何ですか?
動的計画法に関するいくつかのブログ記事があります。これには、ブログでのDynamicMethodクラスの使用に関するいくつかのエントリが含まれます:http://robpaveza.net/tag/dynamic-programming。具体的には、この記事ではファイルリビジョンプルーフの計算方法について説明し、結果の実装をここで確認できます(明らかに、パート2を作成したことはありませんが、リンクしたBN#での実装は分析の結果です)。
コンパイル方法について説明します。
最後のメソッドは、uintパラメーターを取り出すことです。この行は、uint-refランタイムタイプへの参照を取得します。通常のC#で記述した場合、メソッド宣言は次のようになります。
public static void CheckRevision(out uint a, out uint b, out uint c, out uint s);
38-40。foreach(数式の文字列数式)CompileStandardFormula(ジェネレーター、数式)
それについてのブログ投稿で述べているように、私が行う数学は常に次の形式で提供されます。
A=A-S B=B-C C=C+A A=A+B
ここで、A、B、およびCは状態変数であり、Sは入力(ファイルからの次のuint値)です。
CompileStandardFormula関数は、示されている4つの個別の操作のロジックを計算するILを発行します。CLRはスタックベースのステートマシンであり、数学演算はスタック上の値がポップされ、結果がプッシュされることで発生することを思い出してください。したがって、たとえばA = ASの場合、次のILが放出されます。
ldarg.0 // push &A, which is a reference to the location that actually contains the value of A
ldarg.0 // push &A
ldind.u4 // dereference the top-most value on the stack, which puts the actual value of &A ready for operation
ldarg.3 // push &S
ldind.u4 // dereference &S
sub // subtracts [stack-1] from [stack-2], which effectively is A-S
stind.u4 // remember the first ldarg.0? That's getting accessed now and the subtraction result is going there
したがって、この時点で、理解するのは非常に簡単です。私のDynamicMethodは、ファイル内の1回のパスですべての状態変数を更新するために必要な数学演算をコンパイルします。すべてのILが発行された後、スタックの状態には何も含まれていないことがわかっているため(とにかく、メソッドが入力されたときよりも)、簡単な「ret」命令をスローするだけで完了です。
とにかく、これがお役に立てば幸いです。