c# – 为什么不能捕获MissingMethodException?

我在ClickOnce部署的应用程序中依赖于.NET 2.0 SP2
(ApplicationDeployment.CurrentDeployment.CheckForDetailedUpdate(false)方法仅为SP2).

我想在应用程序启动期间检查SP2是否存在.我尝试通过捕获MissingMethodException在调用一个仅SP2方法后检测到这一点.

/// <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();
        }
    }

当在没有SP2的.NET 2.0上运行时,catch中的代码不会执行.该异常仅由AppDomain.CurrentDomain.UnhandledException事件处理程序捕获.

MissingMethodException如何被捕获?我可以想象这是一个特殊情况 – CLR命中一个不存在的方法,不知何故不能将它传递给catch块.我想了解这个背后的原则.

任何人都有这方面的资源吗?有没有其他例外,不能被抓住catch块?

解决方法

我怀疑这是在JIT时间发生的,甚至在方法正确输入之前 – 即在你的catch块被击中之前.有可能如果在调用方法中捕获MissingMethodException,那么将排序…特别是如果使用MethodImpl [MethodImplOptions.NoInlining]装饰CheckDotNet2SP.它仍然听起来像是很漂亮的骰子.

您可以随时检查方法的存在,而不是尝试调用它.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...