[英]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/h3c68sh6和http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldc_i4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.