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

我想检查在应用启动过程中是否存在SP2。我试图通过调用仅SP2的方法后捕获MissingMethodException来检测到这一点。

    /// <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,则可能会对其进行整理...尤其是如果您使用CheckDotNet2SP装饰MethodImpl[MethodImplOptions.NoInlining]。听起来还是蛮可笑的。

您总是可以通过反射来检查该方法的存在,而不是尝试通过调用它来进行检查。

09-25 18:30