title: Why is it not possible to catch MissingMethodException?
body: <p>I have a dependency on .NET 2.0 SP2 in my ClickOnce deployed application
  (the <code>ApplicationDeployment.CurrentDeployment.CheckForDetailedUpdate(false)</code> method is SP2 only).</p>
  
  <p>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.</p>
  
  <pre><code>    /// &lt;summary&gt;
      /// 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.
      /// &lt;/summary&gt;
      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></pre>
  
  <p>The code in catch never executes when this runs on .NET 2.0 without SP2. The exception is only caught by the <code>AppDomain.CurrentDomain.UnhandledException</code> event handler.</p>
  
  <p>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.</p>
  
  <p>Anyone has any resources on this issue? Are there any other exceptions that cannot be caught in a catch block?</p>