gpt4 book ai didi

c# - 为什么无法捕获 MissingMethodException?

转载 作者:可可西里 更新时间:2023-11-01 08:32:34 25 4
gpt4 key购买 nike

我在 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 block 。我想了解这背后的原理。

有人有关于这个问题的任何资源吗?是否还有其他无法在 catch block 中捕获的异常?

最佳答案

我怀疑它发生在 JIT 时间,甚至在正确输入方法之前 - 即在您的 catch block 被命中之前。如果您在调用 方法中捕捉到MissingMethodException,这可能会解决问题...特别是如果您装饰CheckDotNet2SPMethodImpl[MethodImplOptions.NoInlining]。不过,这听起来仍然很冒险。

您始终可以通过反射检查方法是否存在,而不是尝试调用它。

关于c# - 为什么无法捕获 MissingMethodException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3546580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com