Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将TargetFrameworkVersion从3.5升级到4.5后用户未处理的异常_C#_.net - Fatal编程技术网

C# 将TargetFrameworkVersion从3.5升级到4.5后用户未处理的异常

C# 将TargetFrameworkVersion从3.5升级到4.5后用户未处理的异常,c#,.net,C#,.net,我们正在开发一个现有的应用程序,目前的目标是.NET Framework 3.5。在新版本中,应用程序应在.NET 4.5上运行。为了进行测试,我将项目升级为使用.NETFramework4.5 首先,似乎一切正常。应用程序(WinForm)按预期运行。当我直接启动可执行文件时,什么也没有发生,而且一切似乎都正常工作。但是,当我在Visual Studio的debug中启动应用程序时,许多NullReferenceException会在代码上抛出,而在.NET Framework 3.5中则没有

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

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

受影响的代码段如下所示:

public string ConsistencyContextKey
{
get { return Container.ConsistencyCheckRuleCo.ContextKey; }
}
在异常情况下,属性
ConsistencyCheckRuleCo
为空

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

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

最后,通过
方法调用属性。invoke()

SecurityUtils.MethodInfoInvoke
的源代码可以在
ReflectPropertyDescriptor.GetValue()
中找到

我知道它来自4.6.1,但没有任何变化,在4.5中也是一样的

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


属性是公共的,不是泛型的,并且类型是可见的。

Visual Studio之所以说用户未处理的异常是因为设置了“仅启用我的代码”。调试器无法知道.NET Framework中的方法
ReflectPropertyDescriptor.GetValue()
具有Try-Catch块。如果禁用此设置,警告将不再显示。我从这张照片中得到了暗示

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


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

Visual Studio之所以说用户未处理的异常是因为设置了“仅启用我的代码”。调试器无法知道.NET Framework中的方法
ReflectPropertyDescriptor.GetValue()
具有Try-Catch块。如果禁用此设置,警告将不再显示。我从这张照片中得到了暗示

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


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

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