0

* 2 などに IL を注入して動的メソッドを作成する方法を知っています。

ただし、bが定数であるa * bのようになりたいです。

このことを考慮。

int b = SomeClassInstance.Multiplier;

Func<int,int> MultA = CreateDynMethod(b);

for(int i = 0; i < 1000; i++)
{
    int a = GetValueSomewhere();
    int result = MultA(a);
    Console.WriteLine(result);
}

参照.. b は 1000 回の反復すべてで同じです。ただし、どうなるかはわかりません。0 1 2 など。

私の質問は、 b 値を IL に定数として埋め込む方法です。

これは非常に重要な違いです。var a * var b を計算したくありません。(たとえば、実行時に b == 2 の場合) * 2 を実行する IL を作成したい。

私にはそうする理由があります。質問に書かれているとおりに答えてください。ありがとうございました。

編集。ここにあなたの助けを借りて書くことができたものがあります. どう思うか教えてください

    static Func<int, int> IL_EmbedConst(int b)
    {
        var method = new DynamicMethod("EmbedConst", typeof(int), new[] { typeof(int) } );

        var il = method.GetILGenerator();

        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldc_I4, b);
        il.Emit(OpCodes.Mul);
        il.Emit(OpCodes.Ret);

        return (Func<int, int>)method.CreateDelegate(typeof(Func<int, int>));
    }
4

2 に答える 2

3

ldc.i4オペコードが必要です。

これにより、スタックに int がロードされ、その後にmul.

次のように使用できます。

ilGen.Emit(OpCodes.Ldc_I4, b);

ちなみに、ここでは IL からメソッドを構築する必要はありません。この方法も同様に機能します。

Func<int, int> CreateDynMethod(int b)
{
    return a => a * b;
}
于 2012-06-13T21:24:31.220 に答える
1

おそらく次のようなものを発行したいでしょう

 ldarg.1
 ldc.i4 2
 mul
 ret

を使用して2行目を発行できます

 il.Emit(OpCodes.Ldc_I4, 2);

または、明確にするために:

 int b = 2;
 il.Emit(OpCodes.Ldc_I4, b);

http://msdn.microsoft.com/en-us/library/h3c68sh6 およびhttp://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4を参照してください。

于 2012-06-13T21:24:51.843 に答える