【发布时间】: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 的来源可以在here 和ReflectPropertyDescriptor.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。