У меня есть зависимость от .NET 2.0 SP2 в моем развернутом приложении ClickOnce (метод 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();
}
}
Код в catch никогда не выполняется, если он работает в .NET 2.0 без SP2. Исключение перехватывается только обработчиком событий AppDomain.CurrentDomain.UnhandledException
.
Как это возможно, что MissingMethodException не перехватывается? Я могу представить, что это частный случай — CLR натыкается на метод, которого не существует, и каким-то образом невозможно передать это в блок catch. Я хотел бы понять принцип, лежащий в основе этого.
У кого-нибудь есть ресурсы по этому вопросу? Существуют ли какие-либо другие исключения, которые нельзя поймать в блоке catch?