为什么不能赶上的MissingMethodException? [英] Why is it not possible to catch MissingMethodException?

查看:152
本文介绍了为什么不能赶上的MissingMethodException?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在.NET 2.0 SP2在我的ClickOnce部署的应用程序的依赖 (在 ApplicationDeployment.CurrentDeployment.CheckForDetailedUpdate(假)方法是SP2只)。

I have a dependency on .NET 2.0 SP2 in my ClickOnce deployed application (the ApplicationDeployment.CurrentDeployment.CheckForDetailedUpdate(false) method is SP2 only).

我想检查SP2是否是在应用程序启动时present。我曾尝试通过调用SP2的唯一方法后赶上的MissingMethodException检测到这一点。

I would like to check whether SP2 is present during app startup. I have tried to detect this by catching MissingMethodException after calling a SP2-only method.

    /// <summary>
    /// The SP2 bootstrapper does not allow HomeSite installation
    /// http://msdn.microsoft.com/en-us/vstudio/bb898654.aspx
    /// So we only advice the user to download .NET 2.0 SP2 manually.
    /// </summary>
    private void CheckDotNet2SP()
    {
        WaitHandle wh = new AutoResetEvent(true);
        try
        {
            wh.WaitOne(1); //this method is .NET 2.0 SP2 only
        }
        //NOTE: this catch does not catch the MissingMethodException
        catch (Exception) //change to catch(MissingMethodException) does not help
        {
            //report that .NET 2.0 SP2 is missing
        }
        finally
        {
            wh.Close();
        }
    }

在code在追赶从未执行时,这个运行在.NET 2.0没有SP2。唯一的例外是只抓到了 AppDomain.CurrentDomain.UnhandledException 事件处理程序。

这怎么可能是的MissingMethodException不抓?我可以想像,这是一个特例 - 在CLR打一个不存在的方法,并不知它是不可能把它传递给catch块。我想了解这背后的原理。

How is it possible that the MissingMethodException is not caught? I can imagine that this is a special case - the CLR hits a method that does not exist and somehow it is not possible to pass this to the catch block. I would like to understand the principle behind this.

任何人有任何关于此问题的资源?是否有不能被捕获在catch块中的任何其他异常?

Anyone has any resources on this issue? Are there any other exceptions that cannot be caught in a catch block?

推荐答案

我怀疑这是发生在JIT时,该方法是正确的,甚至进入前 - 即在你的catch块击中。它的可能的,如果你赶上的MissingMethodException 呼叫的方法,将梳理出来......特别是如果你装饰 CheckDotNet2SP MethodImpl [MethodImplOptions.NoInlining] 。它仍然听起来就像将pretty的冒险,但。

I suspect it's happening at JIT time, before the method is even properly entered - i.e. before your catch block is hit. It's possible that if you catch MissingMethodException in the calling method, that will sort it out... particularly if you decorate CheckDotNet2SP with MethodImpl[MethodImplOptions.NoInlining]. It still sounds like it would be pretty dicey though.

您可以随时检查的方法与反思的presence而不是试图尽管调用它。

You could always check for the presence of the method with reflection rather than by trying to call it though.

这篇关于为什么不能赶上的MissingMethodException?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆