C # вызывает общедоступный нестатический метод с использованием отражения без создания экземпляра его класса

Возможно ли в 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());
        }

Спасибо


person Arslan    schedule 17.06.2011    source источник
comment
public static void MyMethod() это не нестатично. и NO нельзя вызывать нестатический метод без создания экземпляра.   -  person Bala R    schedule 17.06.2011
comment
Вы хотели сделать MyMethod статичным?   -  person Sven    schedule 17.06.2011
comment
Просто из любопытства - чего вы надеетесь достичь?   -  person RB.    schedule 17.06.2011
comment
Почему вы пытаетесь это сделать?   -  person Peter Lillevold    schedule 17.06.2011
comment
@Bala Я удалил ключевое слово static, моя ошибка :(   -  person Arslan    schedule 17.06.2011
comment
@Ars Что именно вы пытаетесь сделать, потому что вызов метода экземпляра без экземпляра не имеет особого смысла. Возможно, люди, использующие stackoverflow, смогут предложить другой путь, отличный от того, который вы выбрали, если вы объясните проблему, которую пытаетесь решить.   -  person Bala R    schedule 17.06.2011
comment
@Bala Даже с классами Emit (DynamicMethod, ...).   -  person Arslan    schedule 17.06.2011
comment
Это просто проблема, я слышал о пространстве имен System.Reflection.Emit, и я пытался получить IL MyMethod () и скопировать его в DynamicMethod.   -  person Arslan    schedule 17.06.2011
comment
Исключение, которое я получил во втором коде: среда выполнения обнаружила фатальную ошибку. Адрес ошибки был 0x5dceccf5 в потоке 0x2650. Код ошибки - 0xc0000005. Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или неподдающихся проверке частях пользовательского кода. Общие источники этой ошибки включают ошибки маршалинга пользователей для COM-взаимодействия или PInvoke, которые могут повредить стек.   -  person Arslan    schedule 17.06.2011


Ответы (1)


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

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

person Jeff Sheldon    schedule 17.06.2011