C#使用反射调用公共非静态方法,而不实例化其类

本文关键字:实例化 静态方法 反射 调用 | 更新日期: 2023-09-27 17:59:20

在C#中是否可以在不实例化其类的情况下调用方法(非静态),例如:

public class MyClass
{
    public void MyMethod()
    {
        Console.WriteLine("method called");
    }
}

我使用System.Reflection.Emit命名空间尝试了这个方法,我将MyMethod()的IL复制到了一个动态方法中,但出现了一个异常:

检测到致命执行引擎错误:运行时遇到致命错误。错误的地址位于线程0x2650上的0x5dcecf5。错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM互操作或PInvoke的用户封送处理错误,这些错误可能会损坏堆栈。

        Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
        Type t = a.GetType("Tutorial.MyClass");
        MethodInfo m = t.GetMethod("MyMethod");
        MethodBody mb = m.GetMethodBody();
        DynamicMethod dm = new DynamicMethod("MethodAlias", null, Type.EmptyTypes, typeof(Tutorial.MainWindow), true);
        DynamicILInfo ilInfo = dm.GetDynamicILInfo();
        SignatureHelper sig = SignatureHelper.GetLocalVarSigHelper();
        ilInfo.SetLocalSignature(sig.GetSignature());
        ilInfo.SetCode(mb.GetILAsByteArray(), mb.MaxStackSize);
        try
        {
            dm.Invoke(this, null);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

感谢

C#使用反射调用公共非静态方法,而不实例化其类

我不知道。因为它不是静态的。

我只想说"不",但我的回复不够长。