繁体   English   中英

运行时使用的应用程序框架版本目标和Net Framework版本

[英]Application framework version target and Net Framework version used in runtime

我在.Net 4.0中构建了一个小型示例应用程序,以测试一些任务异常处理。 我写下面的代码

       Task.Factory.StartNew(() =>
       {
           throw new Exception("Exception");
       }
       Thread.Sleep(100);
       GC.Collect();
       GC.WaitForPendingFinalizers();

我期望,因为我的应用程序是net 4.0,所以我将得到一个未处理的异常,但是什么也没有发生。 我在帖子中看到UnobservedTaskException不会终止进程 ,即使您的应用程序是.Net 4.0(如果您安装了Net Framework 4.5),它也会在以后运行。
确实,当我添加时:

 <runtime> 
    <ThrowUnobservedTaskExceptions enabled="true"/> 
 </runtime> 

与4.5中的应用程序一样引发异常

有人可以解释有关应用程序版本和已安装框架版本的一般原则吗?

“一般原则”是,当您最初在项目中定位4.0时,.NET 4.5及更高版本的行为将尽可能类似于.NET 4.0。 由于编译器嵌入到程序集中的[TargetFrameworkAttribute] ,它知道您的目标。

当然,这非常重要,.NET 4.5中的此设计更改已重大突破。 您不希望.NET 4.0应用程序以前忽略了该异常,并且在运行于较新的运行时版本时,总是坚持要求它突然失败。 然后,您可能会想起一种更为常见的方法,尤其是由于没有一种体面的方法来发现这些异常,所以您可能会假设。 这是一个非常糟糕的设计选择,Microsoft在4.5中对其进行了更正。

它只有一些配置设置,您可以用来覆盖此兼容性行为,ThrowUnobservedTaskExceptions是其中之一。 将行为反向移植到4.0应用程序被认为是有用的,这确实是有用的。 如果在只有4.0的计算机上运行应用程序,则该应用程序将无效。 另一个例子在这里

执行此操作的代码位于此处 内部System.CLRConfig类是4.5中的新增功能。 由于解析.config文件的代码也位于CLR中,因此实际的实现位于CLR内部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM