我的 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 块被击中之前。它是possible如果你抓住MissingMethodException
in the calling方法,这会解决问题......特别是如果你装饰CheckDotNet2SP
with MethodImpl[MethodImplOptions.NoInlining]
。不过,听起来还是很冒险。
您始终可以通过反射来检查该方法是否存在,而不是尝试调用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)