Ошибка при использовании условной точки останова в System.Type - программирование
Подтвердить что ты не робот

Ошибка при использовании условной точки останова в System.Type

Это функция:

public void Init(System.Type Type) {
    this.Type = Type;
    BuildFieldAttributes();
    BuildDataColumns(FieldAttributes);
}

Я установил точку останова в первой строке (this.Type = Type), и я хочу сломать, когда Type.FullName == "Malt.Organisation", чтобы я ввел как условие.

Однако при ударе строки отображается следующая ошибка:

Условие для точки останова не удалось выполнить. Условием было 'Type.FullName == "Malt.Organisation" '. Ошибка была возвращена 'Проверка состояния объекта в debuggee типа System.Type в этом контексте не поддерживается. '

Что (очевидная) вещь я делаю неправильно?

PS. Обходным путем является добавление этого кода:

if (Type.FullName == "Malt.Organisation") System.Diagnostics.Debugger.Break();
4b9b3361

Ответ 1

В моем случае я использовал Visual Studio 2013, NUnit 2.6.4 и прикреплял отладчик к сеансу unit test, и я получал подобное сообщение:

Условие для точки останова не удалось выполнить. Условие было "type.Name.Contains(" FooBar ")". Обнаружена ошибка: "Проверка состояния объекта в debuggee типа System.Type не поддерживается в этом контексте". Нажмите "ОК", чтобы остановиться на этой точке останова.

Это было вызвано отсутствующей функцией нового механизма отладки, который Microsoft представила, по-видимому. Следуя инструкциям этот msdn blogpost У меня все получилось. Инструкции сводятся к следующему:

  • В меню " Сервис" откройте " Параметры"
  • С левой стороны выберите " Отладка", " Общие"
  • Прокрутите весь путь вниз, чтобы проверить " Использовать режим совместимой совместимости"

Это должно перейти к устаревшему движку отладки, который в моем случае допускал выражения в Type в условиях точки останова. Обратите внимание, что вам необходимо перезапустить приложение или сеанс отладки, очевидно.

Отказ от ответственности: я понятия не имею, какие другие эффекты проверяли этот вариант. Лично я отключил его, когда закончил задачу, требующую его...

Ответ 2

Вы говорите, что Type.FullName == "Malt.Organisation" заставляет его сломаться, попробовали ли вы this.Type.FullName == "Malt.Organisation"?

Другая возможность, считает ли отладчик, что вы пытаетесь вызвать статический метод, имея переменную с именем Type, например, ее имя класса? Переименовывает ли переменная Type в другое исправление?

Ответ 3

Я столкнулся с этим, но при тестировании IsInterface в веб-приложении. Вместо того, чтобы добавлять дополнительные функции в отладчик, я просто обманывал.

bool blnIsInterface = tType.IsInterface;

//Insert breakpoint here...
if(blnIsInterface)
{
    ...
}

Итак, в вашем случае вы можете сделать что-то вроде

public void Init(System.Type Type) {
    bool blnBreak = Type.FullName == "Malt.Organisation";
    //insert breakpoint of blnBreak == true
    this.Type = Type;
    BuildFieldAttributes();
    BuildDataColumns(FieldAttributes);
}

Это немного громоздко, но, по крайней мере, вам не придется беспокоиться о производительности и разрешать отладку собственного кода, похоже, не является вариантом в веб-приложениях.

Ответ 4

Я не уверен в том, что решение "Использовать управляемый режим совместимости" описано здесь - мне не помогло, но в моем случае Project > Properties > Debug > Enable Native code debugging - не нужно отмечать.

Почему - нет подсказки в настоящее время.

Использовал .net 4.5, vs2015, консольное приложение.