DynamicMethod动态方法的使用


0X00 基本用例

DynamicMethod类允许在运行时生成和执行方法,而不必生成动态程序集和动态类型来包含该方法,尽管动态方法属于 static 方法,但在 .NET Framework 2.0 版中引入的委托绑定宽松规则允许将动态方法绑定到对象,这使得在使用该委托实例调用动态方法时,可以像调用实例方法那样来调用。下面提供的 CreateDelegate(Type,Object) 方法重载示例对此进行了演示。再类里声明一个委托 HelloDelegate

namespace ConsoleApp1
{
    class Program
    {
        private delegate int HelloDelegate(string msg, int ret);
        static void Main(string[] args)

创建一个指定参数类型的数组动态方法,这个动态方法有一个字符型参数和一个整数参数。在创建一个名为“Hello”的动态方法,返回类型Integer 和两个参数,其类型由数组 helloArgs。在模块中创建方法定义字符串类。

Type[] helloArgs = { typeof(string), typeof(int) };
            DynamicMethod hello = new DynamicMethod("Hello",
            typeof(int),
            helloArgs,
            typeof(string).Module);
            Type[] writeStringArgs = { typeof(string) };

获取具有一个的 Console.WriteLine 的重载,创建一个动态方法的委托并执行,可正常执行并输出

MethodInfo writeString = typeof(System.Console).GetMethod("WriteLine", writeStringArgs);
            ILGenerator il = hello.GetILGenerator();
            il.Emit(OpCodes.Ldarg_0);
            // Call the overload of Console.WriteLine that prints a string.
            il.EmitCall(OpCodes.Call, writeString, null);
            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Ret);
            HelloDelegate hi = (HelloDelegate)hello.CreateDelegate(typeof(HelloDelegate));
            int retval = hi("Hello World!",42);
            Console.WriteLine("Invoking delegate hi(\"Hello, World!\", 42) returned: " + retval);

0X01 后记

尝试替换成Process类后抛出异常“JIT 编译器遇到内部限制”,原因未知