Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用反射调用公共非静态方法,而不实例化其类_C#_Reflection_Dynamicmethod - Fatal编程技术网

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

C#使用反射调用公共非静态方法,而不实例化其类,c#,reflection,dynamicmethod,C#,Reflection,Dynamicmethod,在C#中,是否可以在不实例化其类的情况下调用方法(非静态),例如: public class MyClass { public void MyMethod() { Console.WriteLine("method called"); } } 我使用System.Reflection.Emit命名空间尝试了此方法,我将MyMethod()的IL复制到了一个动态方法,但出现了一个异常: 检测到FATAlexecutionEngineer错误: 运行时遇到致

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

public class MyClass
{
    public void MyMethod()
    {
        Console.WriteLine("method called");
    }
}
我使用System.Reflection.Emit命名空间尝试了此方法,我将MyMethod()的IL复制到了一个动态方法,但出现了一个异常:

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


谢谢你,据我所知不是这样。因为它不是静态的


我只想说“不”,但我的回答不够长。

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


我只想说“不”,但我的回答不够长。

公共静态void MyMethod()
这不是非静态的。不,你不能在不创建实例的情况下调用非静态方法。你是想让
MyMethod
static吗?只是出于好奇-你希望实现什么?你为什么要这么做?@Bala我删除了static关键字,我的错:(
public static void MyMethod()
这不是非静态的。不,你不能在不创建实例的情况下调用非静态方法。你是想让
MyMethod
成为静态的吗?只是出于好奇-你希望实现什么?你为什么要这样做?@Bala我删除了static关键字,我的错误:(
        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());
        }