VerificationException при использовании DynamicMethod в Silverlight - PullRequest
4 голосов
/ 14 апреля 2011

Я хочу вызвать определенные методы через делегатов, но получаю VerificationException. Я использую следующий код:

    internal delegate void Delegete_add_Startup(object o, StartupEventHandler s);
    Delegete_add_Startup del;

    public App()
    {
        //this.Startup += this.Application_Startup;

        Type[] parameterTypes = new Type[2];
        parameterTypes[0] = typeof(object);
        parameterTypes[1] = typeof(StartupEventHandler);

        MethodInfo mi = typeof(Application).GetMethod("add_Startup", BindingFlags.Public | BindingFlags.Instance);

        DynamicMethod method = new DynamicMethod(string.Empty, mi.ReturnType, parameterTypes);
        method.InitLocals = true;
        ILGenerator iLGenerator = method.GetILGenerator();
        iLGenerator.Emit(OpCodes.Ldarg_0);
        iLGenerator.Emit(OpCodes.Ldarg_1);
        iLGenerator.Emit(OpCodes.Call, mi);
        iLGenerator.Emit(OpCodes.Ret);
        del = (Delegete_add_Startup)method.CreateDelegate(typeof(Delegete_add_Startup));


        del(this, new StartupEventHandler(Application_Startup));


        this.Exit += this.Application_Exit;
        this.UnhandledException += this.Application_UnhandledException;

        InitializeComponent();
    }

В основном, я пытаюсь позвонить

this.Startup + = this.Application_Startup;

через делегата с использованием кода выше.

Это дает исключение VerificationException: операция может дестабилизировать исключение времени выполнения.

Это очень легко воспроизвести, поместив этот код в конструктор приложения нового проекта приложения Silverlight. Что я делаю не так?

1 Ответ

0 голосов
/ 15 июня 2011

В вашем случае вы можете заменить OpCodes.Call на OpCodes.CallVirt, он должен работать лучше (непроверенный и непонятый, я новичок в тонкостях Silverlight CLR).

...