3

何か重要なものが欠けているのではないかと思いますが、動的メソッドを使用して IL で条件文を作成する方法がわかりません。以前は軽く手を出しただけでしたが、コードを拡張する必要があります。

私が見つけていないドキュメント (CLI ドキュメント以外) はありますか、または誰かがサンプル コードを持っていますか? それは素晴らしいことです。

乾杯、

4

2 に答える 2

4

正確なコードに応じて、さまざまな分岐命令があなたの味方になります。

ここは

if(memory[pointer] > 0) goto IL_0002;

イリノイ州:

IL_001f:  ldsfld     uint8[] BFHelloWorldCSharp.Program::memory
IL_0024:  ldsfld     int16 BFHelloWorldCSharp.Program::pointer
IL_0029:  ldelem.u1
IL_002a:  ldc.i4.0
IL_002b:  bgt      IL_0002

基本的に、比較したい値をスタックにプッシュしてから、bgtを呼び出して必要な場所にジャンプします。

brtrue/brfalse や beq などの IL コマンドの概要については、OpCodesクラスを確認してください。

また、C# で if コマンドを記述してコンパイルし、ILDASM または Reflector を使用して生成された IL を確認することもお勧めします。

于 2010-04-27T05:45:12.503 に答える
1

方法は次のとおりです。

ラベルを定義します。例:

var skipProperty = il.DefineLabel();

あなたの状態を呼び出します:

il.Emit(OpCodes.Brtrue, skipProperty);

スキップしたい場所(たとえば、ifの終わり):

il.MarkLabel(skipProperty);

したがって、ラベルを作成します(参照が存在するように最初に作成する必要があります。後で「マーク」を呼び出して、必要なコードの実際の場所にラベルを配置します)。OpCodes.Brtrueは、リンクテキストの記事にリストされている多くの条件付き操作の1つにすぎません(Michaelに感謝します)

于 2010-04-27T06:08:44.053 に答える