C # вызывает публичный нестатический метод, используя отражение, не создавая его класса - PullRequest
0 голосов
/ 17 июня 2011

Возможно ли в C # вызывать метод (нестатический) без создания экземпляра его класса, например:

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

Я пробовал этот метод с использованием пространства имен System.Reflection.Emit, я скопировалIL MyMethod () для динамического метода, но получил исключение:

FatalExecutionEngineError: Обнаружена фатальная ошибка времени выполнения.Адрес ошибки был 0x5dceccf5 в потоке 0x2650.Код ошибки 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());
        }

Спасибо

1 Ответ

3 голосов
/ 17 июня 2011

Не то, что я знаю.Потому что это не статично.

Я бы просто сказал «Нет», но мой ответ не был достаточно длинным для SO.

...