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 编译器遇到内部限制”,原因未知