Mar*_*rek 11 .net c# clr missingmethodexception .net-2.0
我在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();
}
}
Run Code Online (Sandbox Code Playgroud)
当在没有SP2的.NET 2.0上运行时,catch中的代码永远不会执行.该异常仅由AppDomain.CurrentDomain.UnhandledException事件处理程序捕获.
怎么可能没有捕获到MissingMethodException?我可以想象这是一个特殊情况 - CLR命中一个不存在的方法,并且不可能以某种方式将它传递给catch块.我想了解这背后的原理.
任何人都有这方面的资源吗?是否有任何其他异常无法在catch块中捕获?
Jon*_*eet 14
我怀疑它发生在JIT时间,在方法正确输入之前 - 即在你的catch块被击中之前.这是可能的,如果你赶MissingMethodException在调用方法,将它整理出来......特别是如果你装饰CheckDotNet2SP用MethodImpl[MethodImplOptions.NoInlining].它听起来仍然很冒险.
你总是可以通过反射来检查方法的存在,而不是通过尝试调用它.
Abe*_*bel 12
有一些例外被定义为"不可恢复".其中之一是MissingMethodException,因为如果一个类中缺少一个方法,这是一个严重的错误,它需要卸载类并重新加载一个新的类来恢复,这是不可能完成的(如果有的话).
要恢复,您需要重新安装,检查程序集的版本,检查PE映像是否有效等.
如果您只想知道是否安装了SP2,则默认方法是使用引导应用程序,该应用程序只检查已安装的版本.如果一切正常,它运行应用程序,如果没有它显示一个很好的消息.
OP请求更新:
其他难以捕获或无法捕获的异常(可能取决于您的.NET版本,即.NET 4.0添加了更多OutOfMemoryException无法捕获):( 可以在同步时捕获),StackOverflowException(永远不会被捕获) ), ThreadAbortException(可以被捕获,但很特别,因为它会自动在catch块结束)被重新抛出,BadImageFormatException而MissingManifestResourceException如果你想尝试抓住它在装配抛出异常(如果你动态加载它,同有MissingMethodException,你有能力抓住它).通常,任何不继承的异常Exception都很难捕获(但是你可以使用通用的try/catch块来捕获它们).
还有其他一些,但前面的三个是你在实践中经常遇到的.
| 归档时间: |
|
| 查看次数: |
2817 次 |
| 最近记录: |