【问题标题】:User-unhandled exception after upgrading TargetFrameworkVersion from 3.5 to 4.5将 TargetFrameworkVersion 从 3.5 升级到 4.5 后用户未处理的异常
【发布时间】:2016-07-09 14:15:47
【问题描述】:

我们正在开发当前面向 .NET Framework 3.5 的现有应用程序。在新版本中,应用程序应在 .NET 4.5 上运行。为了进行测试,我将项目升级为使用 .NET Framework 4.5。

首先,似乎一切正常。应用程序 (WinForm) 按预期运行。当我直接启动可执行文件并且一切似乎都正常工作时,什么也没有发生。但是,当我从 Visual Studio 调试应用程序时,会在 .NET Framework 3.5 没有的代码上引发许多 NullReferenceExceptions。

受影响的sn-p如下:

public string ConsistencyContextKey
{
get { return Container.ConsistencyCheckRuleCo.ContextKey; }
}

属性ConsistencyCheckRuleCo 在异常情况下为空。

对属性的调用是通过反射进行的。在 .NET 3.5 中,调用来自 System.ComponentModel.ReflectPropertyDescriptor.GetValue(object)。 请参阅调用堆栈:

在 4.5 中,此方法已更改,现在传递给方法 [System.SecurityUtils.MethodInfoInvoke(MethodInfo, object, object[])]。 请参阅调用堆栈:

最后通过method.invoke()调用属性。

SecurityUtils.MethodInfoInvoke 的来源可以在hereReflectPropertyDescriptor.GetValue() here 找到。

我知道它是 4.6.1 的来源,但没有任何改变,在 4.5 中它是一样的。

神奇的是,在ReflectPropertyDescriptor 中,3.5 和 4.5 中也有一个 Try-Catch。那么为什么 Visual Studio 会说当代码进入我的属性时存在用户未处理的异常呢?

属性是公共的,不是通用的,类型是可见的。

【问题讨论】:

  • 反射在 4.5 中进行了重大更改以支持 WinRT,这与此无关。只需确保您没有要求调试器在任何抛出的异常处停止。调试 > 异常对话框。
  • 我不明白为什么 Visual Sudio 说 user-unhandeld Exception。在作为调用基础的 ReflectPropertyDescriptor.GetValue() 中有一个 Try-Catch-Block。

标签: c# .net


【解决方案1】:

Visual Studio 显示用户未处理异常的原因是设置“仅启用我的代码”。调试器无法知道 .NET Framework 中的方法 ReflectPropertyDescriptor.GetValue() 具有 Try-Catch-Block。如果禁用此设置,警告将不再显示。我从这个 stackoverflow question 得到了提示。

我所做的另一个观察是,如果在 3.5 中发生异常,则会转发异常。在 4.5 中,异常将直接在它发生的位置抛出。这仅适用于通过反射和方法MethodInfo.Invoke() 调用属性的情况。

我编写了一个测试应用程序,并在 3.5 上将异常转发到我调用 MethodInfo.Invoke() 的方法。在 4.5 中,我收到消息“用户未处理的异常”。这意味着在处理来自反射调用的异常时发生了一些变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2021-02-15
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多