2016-03-22 16 views
1

現在、.NET Framework 3.5を対象とする既存のアプリケーションを開発中です。新しいバージョンでは、アプリケーションは.NET 4.5で実行する必要があります。テストのために、.NET Framework 4.5を使用するようにプロジェクトをアップグレードしました。TargetFrameworkVersionを3.5から4.5にアップグレードした後のユーザー未処理の例外

まず、すべてが正しく動作しているようでした。アプリケーション(WinForm)は期待どおりに実行されました。実行ファイルを直接起動すると何も起こりません。すべてが正しく動作するようです。しかし、Visual Studioのデバッグでアプリケーションを起動すると、.NET Framework 3.5ではコードでは多くのNullReferenceExceptionsがスローされます。

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[])]に渡す

enter image description here

。 参照コールスタック:プロパティの両方の最後に

enter image description here

method.invoke()経由で呼び出されます。

SecurityUtils.MethodInfoInvokeのソースは、hereとです。

私はそれが4.6.1のソースだと知っていますが、何も変更されておらず、4.5では同じです。

謎のことは、ReflectPropertyDescriptorには、3.5と4.5にもTry-Catchがあります。だから、なぜコードが私の財産に来るときに、ユーザーが未処理の例外があるとVisual Studioは言うのですか?

プロパティはpublicです。ではなく、タイプが表示されます。

+0

WinRTをサポートするために4.5で大幅に変更されました。これはこれとは関係ありません。例外がスローされた場合にデバッガが停止するように要求していないことを確認してください。デバッグ>例外ダイアログ。 –

+0

Visual Sudioがuser-unhandeld Exceptionと言う理由を理解していません。コールのベースとなるReflectPropertyDescriptor.GetValue()には、Try-Catch-Blockがあります。 –

答えて

0

Visual Studioで「未処理の例外」と表示される理由は、「自分のコードを有効にする」という設定が原因です。デバッガは、.NET FrameworkのメソッドReflectPropertyDescriptor.GetValue()にTry-Catch-Blockがあることを認識していません。この設定を無効にすると、警告は表示されなくなります。私はこのstackoverflow questionからのヒントを得た。

私が行ったもう一つの観察は、3.5で例外が発生した場合、例外が転送されるということです。 4.5では例外が発生する位置に直接スローされます。これは、プロパティの呼び出しが反映され、メソッドMethodInfo.Invoke()である場合にのみ適用されます。

私はテストアプリケーションを作成しました.3.5では例外がメソッドに転送されました。ここで私はMethodInfo.Invoke()を呼び出します。 4.5では、 "user-unhandled exception"というメッセージが出ました。つまり、リフレクションコールからExceptionを処理する際に何かが変更されたことを意味します。