Мы разрабатываем существующее приложение, которое в настоящее время нацелено на .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:
В 4.5 этот метод был изменен, и теперь перейдем к методу [System.SecurityUtils.MethodInfoInvoke(MethodInfo, object, object[])]
. См CallStack:
В конце как свойства вызывается через method.invoke()
.
Исходный код для SecurityUtils.MethodInfoInvoke
можно найти here и ReflectPropertyDescriptor.GetValue()
here.
Я знаю, что это источник из 4.6.1, но ничего не изменилось, и в 4.5 оно то же самое.
Таинственная вещь в том, что в ReflectPropertyDescriptor
есть Try-Catch также в 3.5 и 4.5. Итак, почему Visual Studio заявляет, что есть исключение, вызванное пользователем, когда код приходит к моей собственности?
Объект публичный, не общий и вид видна.
Отражение сильно изменилось в 4.5 для поддержки WinRT, что не имеет к этому никакого отношения. Просто убедитесь, что вы не попросили отладчика остановиться на любом исключенном исключении. Отладка> Исключения. –
Я не понимаю, почему Visual Sudio говорит об исключении пользователя-unhandeld. В ReflectPropertyDescriptor.GetValue(), который является базой Call, есть Try-Catch-Block. –