2016-03-22 2 views
1

Мы разрабатываем существующее приложение, которое в настоящее время нацелено на .NET Framework 3.5. В новой версии приложение должно работать на .NET 4.5. Для тестирования я обновил проекты для использования .NET Framework 4.5.Исключенное пользователем исключение после обновления TargetFrameworkVersion от 3.5 до 4.5

Сначала казалось, что все работает правильно. Приложение (WinForm) выполнялось так, как ожидалось. Ничего не происходит, когда я запускаю исполняемый файл напрямую, и все работает правильно. Но когда я запускаю приложение в отладке из Visual Studio, вызывается множество NullReferenceExceptions, в коде, где это не относится к .NET Framework 3.5.

Пострадавшая фрагмент выглядит следующим образом:

public string ConsistencyContextKey 
{ 
get { return Container.ConsistencyCheckRuleCo.ContextKey; } 
} 

Имущество ConsistencyCheckRuleCo является недействительным в случае исключения.

Звонок в собственность через отражение. В .NET 3.5 вызов поступает от System.ComponentModel.ReflectPropertyDescriptor.GetValue(object). См CallStack:

enter image description here

В 4.5 этот метод был изменен, и теперь перейдем к методу [System.SecurityUtils.MethodInfoInvoke(MethodInfo, object, object[])]. См CallStack:

enter image description here

В конце как свойства вызывается через method.invoke().

Исходный код для SecurityUtils.MethodInfoInvoke можно найти here и ReflectPropertyDescriptor.GetValue()here.

Я знаю, что это источник из 4.6.1, но ничего не изменилось, и в 4.5 оно то же самое.

Таинственная вещь в том, что в ReflectPropertyDescriptor есть Try-Catch также в 3.5 и 4.5. Итак, почему Visual Studio заявляет, что есть исключение, вызванное пользователем, когда код приходит к моей собственности?

Объект публичный, не общий и вид видна.

+0

Отражение сильно изменилось в 4.5 для поддержки WinRT, что не имеет к этому никакого отношения. Просто убедитесь, что вы не попросили отладчика остановиться на любом исключенном исключении. Отладка> Исключения. –

+0

Я не понимаю, почему Visual Sudio говорит об исключении пользователя-unhandeld. В ReflectPropertyDescriptor.GetValue(), который является базой Call, есть Try-Catch-Block. –

ответ

0

Причина, по которой Visual Studio говорит, что пользователь не обрабатывается Исключение происходит из-за установки «Включить только мой код». Отладчик не может знать, что метод ReflectPropertyDescriptor.GetValue() из .NET Framework имеет Try-Catch-Block. Если вы отключите этот параметр, предупреждение больше не отображается. Я получил подсказку из этого stackoverflow question.

Еще одно замечание, которое я сделал, состоит в том, что если в 3.5 возникает исключение, исключение будет отправлено. В 4.5 исключение будет выбрасываться непосредственно на том месте, где оно происходит. Это применимо только в том случае, если вызов свойства происходит через отражение и метод MethodInfo.Invoke().

Я написал тестовое приложение, и на 3.5 исключение было отправлено методу, в котором я звоню MethodInfo.Invoke(). В 4.5 я получил сообщение «пользовательское необработанное исключение». Это означает, что что-то изменилось при обработке Исключения из рефлексивных вызовов.

Смежные вопросы