2016-07-07 9 views
0

私はいくつかのタスク例外処理をテストするために.Net 4.0で小さなサンプルアプリケーションを構築します。私のアプリケーションがネット4.0であるように私は私は未処理の例外が、何が起こる取得すること、アプリケーションのフレームワークのバージョンターゲットと実行時に使用されるNet Framworkのバージョン

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

私は期待以下のコードを記述します。私はポストUnobservedTaskException is not killing the processであなたのアプリケーションが.Net 4.0であっても、あなたがネットフレームワーク4.5をインストールしている場合、これは後で実行されることが分かります。
は確かに私が追加したとき:

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

を例外が4.5

にアプリケーションのように投げている人は、アプリケーションのバージョンおよびインストールのフレームワークのバージョンに関する一般的な原則であるかを説明することはできますか?

答えて

2

「一般的な原則」は、当初プロジェクト4.0をターゲットにしたときに.NETバージョン4.5以降が.NET 4.0のようにできるだけ動作することです。コンパイラがアセンブリに埋め込まれた[TargetFrameworkAttribute]のおかげで、あなたが対象としたものがわかりました。

これはかなり重要です。もちろん、この.NET 4.5のデザイン変更はであり、ひどくとなります。これまでは例外を無視していた.NET 4.0アプリケーションが新しいランタイムバージョンで実行されると突然失敗するようなことはしませんでした。これらの例外を発見するうまくいった方法がなかったので、特にあなたが想定するかもしれないより多くの共通点があります。これは非常に悪い設計選択であり、Microsoftはこれを修正しました4.5

この互換動作を無効にするために使用できる設定はThrowUnobservedTaskExceptionsの1つです。この挙動を4.0アプリケーションにバックポーティングすることは有用であると考えられました。あなたが4.0しか持っていないマシンであなたのアプリを走らせるなら、それは効果がありません。別の例is here

これを行うコードはlocated hereです。内部のSystem.CLRConfigクラスは4.5で新しく追加されました。 .configファイルを解析するコードもそこに配置されているため、実際の実装はCLR内にあります。

+0

これらの説明はありがとうございました。マシンフレームワーク4.0と4.5にインストールしたとき、4.0のアプリケーションビルドは4.5ではなく4.0のフレームワークで実行されると思っていましたが、私の場合、アプリケーションは4.5の上で動作するようです。追加する設定はありますか? – Che

+0

いいえ、それは可能ではありません。4.5と4.6は並んでいません。彼らは* 4.0のインストールを上書きします。あなたが今までに4.0を持っているマシンで動かす確率は、今日はかなり小さく、XPまたはServer2003、またはWindows Updateの使用を拒否するユーザーでなければなりません。あなたがサポートしなければならない顧客の種類ではありません。最良の方法は、4.5をターゲットにすることです。 –

+0

ありがとう、面白い、それからアプリケーションは、最新のフレームワークのバージョンの上に実行すると言うことができますそれは何かの予期しない変更につながる可能性がありますアプリケーションに何も変更することなく、フレームワークをアップグレードします。 – Che

関連する問題