簡體   English   中英

如何在運行時注入恆定的IL?

[英]How to inject IL with constant in run-time?

我知道如何通過將IL注入* 2來創建動態方法。

但是我想成為a * b,其中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>));
    }

您需要ldc.i4操作碼。

這會將int加載到堆棧上,然后可以使用mul

您可以這樣使用它:

ilGen.Emit(OpCodes.Ldc_I4, b);

順便說一句,您實際上並不需要從IL構建方法。 此方法也可以工作:

Func<int, int> CreateDynMethod(int b)
{
    return a => a * b;
}

您可能想要發出類似

 ldarg.1
 ldc.i4 2
 mul
 ret

您可以使用發出第二行

 il.Emit(OpCodes.Ldc_I4, 2);

或者,只是要清楚一點:

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

請參閱http://msdn.microsoft.com/en-us/library/h3c68sh6http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM