English 中文(简体)
我何时以及如何使用Ldvirtftn opcode?
原标题:When and how do I use the Ldvirtftn opcode?

以下实例方案是我试图利用<代码>ldvirtftn。 专栏

您认为,这是在把虚拟功能点装到脚架上时要使用的密码。 在示范守则中,Im创建一种有2种固定方法的类型:LdftnLdvirtftn,这两种方法都交还了Base.Method(第1功能Ldftn的开放代表。 使用<代码>ldn ,不出人意料地开展工作,因为<代码>Base.Method为虚拟。 第二种方法使用<代码>Ldvirtftn,显然产生了一个无效的方案。

我做了什么错误? 这一条码的目的是什么?

public class Base
{
    public virtual void Method()
    {
        Console.WriteLine("Base");
    }
}

public class Child : Base
{
    public override void Method()
    {
        Console.WriteLine("Child");
    }
}
class Program
{
    static void Main(string[] args)
    {
        AssemblyBuilder ab =AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Test"),AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder mb = ab.DefineDynamicModule("TestModule");
        TypeBuilder tb = mb.DefineType("TestType");
        MethodBuilder method = tb.DefineMethod("Ldftn",MethodAttributes.Public | MethodAttributes.Static, typeof(Action<Base>), Type.EmptyTypes);
        var ilgen = method.GetILGenerator();
        ilgen.Emit(OpCodes.Ldnull);
        ilgen.Emit(OpCodes.Ldftn, typeof(Base).GetMethod("Method"));
        ilgen.Emit(OpCodes.Newobj, typeof(Action<Base>).GetConstructors()[0]);
        ilgen.Emit(OpCodes.Ret);
        method = tb.DefineMethod("Ldvirtftn", MethodAttributes.Public | MethodAttributes.Static, typeof(Action<Base>), Type.EmptyTypes);
        ilgen = method.GetILGenerator();
        ilgen.Emit(OpCodes.Ldnull);
        ilgen.Emit(OpCodes.Ldvirtftn, typeof(Base).GetMethod("Method"));
        ilgen.Emit(OpCodes.Newobj, typeof(Action<Base>).GetConstructors()[0]);
        ilgen.Emit(OpCodes.Ret);
        var type = tb.CreateType();
        var func = Delegate.CreateDelegate(typeof(Func<Action<Base>>),tb.GetMethod("Ldftn")) as Func<Action<Base>>;
        var func2 = Delegate.CreateDelegate(typeof(Func<Action<Base>>), tb.GetMethod("Ldvirtftn")) as Func<Action<Base>>;
        func()(new Child());
        func2()(new Child());
    }
}
最佳回答
  1. 以下是<代码>ldftn案件的情况。 您的方法设立了一个代表:

    • no first argument (usually used only for static methods);
    • Base.Method() as the method (which is not static).

    您创立了这个代表,作为<代码>Action<Base>,而该代表的计算结果可能只有一个参数。 请将此代表称为代表:

    func()(new Child());
    

    The CLR use the new Child instance as “first debate”. 由于你称之为而不是静态<>,第一种论点成为<条码>。 因此,这一呼吁等于

    new Child().Method();
    

    并导致单独发送虚拟-方法 援引时间(不是在平方英尺时间),因此请上<代码>Child.Method(。 因此,它印刷了“儿童”而不是你可能预期的“基本”。

  2. 在<代码>ldvirtftn的案例中,由于你认为<代码>ldvirtftn<> 代码>要求就栏目提出反对,而<代码>ldftnt.

您可以尝试作出以下修改,以了解一下:

  • 而不是<代码>null,将实际的<代码>Base或Child交给代表的建筑商,如非统计方法的惯例。 您会发现,由于参数不再符合(<代码>),它将拒绝设立该代表。 行动与建议;Base> 要求有一个参数,但Method()没有。

  • 使参数数目相匹配,要么修改<代码>Action<Base>,简单地改为Action,要么通过制定Method(接受一个参数。 在这两种情况下,你可能很快就会发现,你会做些什么。 特别是,你会发现,用<代码>ldftn创建的代表将永远称为Base.Method(),即使你以为榜样创建该代表。 Child

问题回答

暂无回答




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签