gpt4 book ai didi

.net - 发出IL以调用Math函数

转载 作者:行者123 更新时间:2023-12-04 05:04:33 24 4
gpt4 key购买 nike

C#调用

Math.Pow(2,3);

在ILDASM中:
ldc.r8   2.
ldc.r8 3.
call float64[mscorlib]System.Math::Pow(float64, float64)

有人可以告诉我如何通过ILGenerator发出该调用语句吗?谢谢。

最佳答案

这是构建动态方法的示例,该方法将调用静态Math.Pow(double, double)方法:

using System;
using System.Linq;
using System.Reflection.Emit;

class Program
{
static void Main()
{
// define the signature of the dynamic method
var powIt = new DynamicMethod(
"PowIt",
typeof(double),
new Type[] { typeof(double), typeof(double) },
typeof(Program).Module
);

// get a MethodInfo pointer to the Math.Pow(double, double) static
// method that we are willing to use in our dynamic method
var pow = typeof(Math).GetMethod("Pow", new[] { typeof(double), typeof(double) });

var il = powIt.GetILGenerator();
// Push the first argument onto the evaluation stack
il.Emit(OpCodes.Ldarg_0);
// Push the second argument onto the evaluation stack
il.Emit(OpCodes.Ldarg_1);
// Invoke the Math.Pow static method that we obtained a MethodInfo earlier
// by passing the two arguments that are on the evaluation stack
il.Emit(OpCodes.Call, pow);

// Return from the method pushing a return value from the callee's evaluation stack onto the caller's evaluation stack
il.Emit(OpCodes.Ret);

// build a delegate from the dynamic method
var func = (Func<double, double, double>)powIt.CreateDelegate(typeof(Func<double, double, double>));

// Now invoke the delegate
Console.WriteLine(func(2, 3));
}
}

关于.net - 发出IL以调用Math函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8459188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com