首页 > 解决方案 > 如何正确执行 OpCodes.Call?

问题描述

我正在DynamicMethod这篇文章中练习,并且使用以下小代码一切正常:

    private delegate long squareDel(int a);
    squareDel test;

    private void Form1_Load(object sender, EventArgs e)
    {
        DynamicMethod dm = new DynamicMethod("", typeof(long), new Type[] { typeof(int) },typeof(Form1));
        ILGenerator ig = dm.GetILGenerator();

        ig.Emit(OpCodes.Ldarg_0);
        ig.Emit(OpCodes.Conv_I8);
        ig.Emit(OpCodes.Dup);
        ig.Emit(OpCodes.Mul);
        ig.Emit(OpCodes.Ret);

        test = (squareDel)dm.CreateDelegate(typeof(squareDel));
`  `}

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(test(int.Parse(textBox1.Text)).ToString());
    }

但现在我试图用一个小方法将它与 OpCodes.Call 结合起来:

    public long Test(int s)
    {
        return s*s;
    }

并对代码进行以下更改:

        MethodInfo mi = typeof(Form1).GetMethod("Test",new Type[] { typeof(int) });

        ig.Emit(OpCodes.Ldarg_0);
        ig.EmitCall(OpCodes.Call, mi,null);
        ig.Emit(OpCodes.Dup);
        ig.Emit(OpCodes.Mul);
        ig.Emit(OpCodes.Ret);

现在它一直在扔我System.InvalidProgramException

我去网上查找异常,并试图从这篇文章中更改我的构建属性,但无济于事。

而且我在这篇文章中找不到所谓的“高级设置” ,所以我认为这篇文章已经过时了(毕竟是5年前的)。

那么有人可以这么好心并教我如何解决它吗?

非常感激!

标签: c#exceptionopcodedynamicmethod

解决方案


推荐阅读