我在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]
。听起来还是蛮可笑的。
您总是可以通过反射来检查该方法的存在,而不是尝试通过调用它来进行检查。