当前位置: 首页 > 编程语言 > C#

MissingMethodException为什么抓不到?分享

时间:2023-04-10 12:55:56 C#

MissingMethodException为什么抓不到?我在ClickOnce部署的应用程序中依赖于.NET2.0SP2(ApplicationDeployment.CurrentDeployment.CheckForDetailedUpdate(false)方法仅适用于SP2)。我想在应用程序启动期间检查SP2是否存在。我正在尝试通过在调用仅限SP2的方法后捕获MissingMethodException来检测这一点。//////SP2引导程序不允许安装HomeSite///http://msdn.microsoft.com/en-us/vstudio/bb898654.aspx///所以我们只建议用户下载.NET2.0SP2手动。///privatevoidCheckDotNet2SP(){WaitHandlewh=newAutoResetEvent(true);尝试{wh.WaitOne(1);//此方法仅在.NET2.0SP2中有效{wh.Close();在没有SP2的.NET2.0上运行时,永远不会执行catch中的代码。该异常仅由AppDomain.CurrentDomain.UnhandledException事件处理程序捕获。MissingMethodException怎么可能不被捕获?我可以想象这是一个特例-CLR命中了一个不存在的方法,并且无法以某种方式将它传递给catch块。我想了解这背后的基本原理。有人有这方面的资源吗?catch块中是否还有其他无法捕获的异常?我怀疑它发生在JIT时间,在方法被正确输入之前-即在你的catch块被命中之前。如果您在调用方法中捕捉到MissingMethodException,它可能会解决它......特别是如果您使用MethodImpl[MethodImplOptions.NoInlining]装饰CheckDotNet2SP。听起来还是挺冒险的。您始终可以通过反射而不是尝试调用它来检查方法是否存在。有一些异常被定义为“不可恢复”。其中之一是MissingMethodException,因为如果一个类中缺少一个方法,这是一个严重的错误,它需要卸载类并重新加载一个新的类来恢复,这是不可能的(如果有的话)。恢复的话需要重新安装,检查程序集的版本,检查PE镜像是否有效等。如果你只是想知道是否安装了SP2,默认的方法是使用bootapplication,它只是检查安装的版本。如果一切正常,它会运行应用程序,如果没有,它会显示一条好消息。OP请求的更新:其他难以捕获或无法捕获的异常(可能取决于您的.NET版本,.NET4.0增加了更多无法捕获的异常):OutOfMemoryException(可以在同步时捕获),StackOverflowException(永远无法捕获),ThreadAbortException(可捕获的,但很特殊,因为它会在捕获块的末尾自动重新加载)、BadImageFormatException和MissingManifestResourceException如果您尝试在抛出异常的程序集中捕获它(如果您动态加载它,就像MissingMethodException一样,您可以捕获它).通常,任何不从Exception继承的异常都很难捕获(但您可以使用通用的try/catch块捕获它们)。还有其他的,但前三个是您在实践中经常遇到的。异常是在JIT编译步骤中抛出的,因此您不会单步执行该方法。试试这个版本:privateboolCheckDotNet2SP(){try{CheckImpl();返回真;}catch(MissingMethodException){返回false;}}[MethodImpl(MethodImplOptions.NoInlining)]privatevoidCheckImpl(){使用(varwh=newManualResetEvent(true))wh.WaitOne(1);您可以使用反射来查看该方法是否存在。以上就是C#学习教程:MissingMethodException为什么抓不到?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——privatevoidCheckDotNet2SP(){returntypeof(WaitHandle).GetMethod("WaitOne",newType[]{typeof(int)})!=null;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: