Окна отладчика VS2010 теряют разрешение типов при использовании MS Code Contracts - PullRequest
2 голосов
/ 08 июля 2011

С момента начала использования контрактов кода (.NET 4.0, VS2010 Ultimate и Premium) мы столкнулись со странной проблемой в окнах отладчика.

У меня есть простое решение с одним исполняемым файлом, одна библиотека, которая использует кодКонтракты и одна библиотека, которая этого не делает.Каждая библиотека содержит один класс и в конструкторе класса инициализирует список целых чисел.Если мы поместим точку останова после инициализации списка и посмотрим на нее в окнах отладчика (включая непосредственное окно), мы сможем увидеть значения просто отлично.Однако, если мы попытаемся привести значение к явному типу, оно сломается.

В библиотеках, которые не используют Code Contracts, в окнах отладчика работают следующие функции:

(List<int>)nums

В библиотеках, которые используют Code Contracts, создается «Тип или пространство имен« Список »недопустимо в этой области ». Мы должны сделать следующее, чтобы заставить его работать:

(System.Collections.Generic.List<int>)nums

Обратите внимание, что код работает нормально, проблем нет, проблема только в окнах отладчика.

ОБНОВЛЕНИЕ: Единственный параметр, который, кажется, оказывает влияние, - это флажок рядом с «Выполнить проверку контракта во время выполнения» на вкладке «Контракты кода» в свойствах проекта. После просмотра кода в ILSpy,Я нашел атрибут, добавленный в assemblyinfo.cs, атрибут (RuntimeContractsAttribute) и перечисление (RuntimeContractsFlags), добавленный в мой проект. По какой-то причине я скопировал код для этих элементов из ILSpy и создал свою собственную версию. Теперь всеработает. Но когда я выбираю «Построить» ссылочную сборку контракта, сборка завершается неудачно. (Я предполагаю, что генератор ссылокпытается добавить код, сгенерированный компилятором, и бомбы вызывают его добавление вручную.) Однако, без добавления кода времени выполнения вручную, отладчик все равно не работает независимо от параметра Ссылочная сборка контракта сборки.

Ответы [ 2 ]

0 голосов
/ 08 мая 2013

Да, это известная проблема.В pdb сборки есть некоторая отладочная информация, которую мы, вероятно, неправильно поддерживаем, имея дело с набором областей применения в данной точке.Это влияет на то, что предположит отладчик, находится в области видимости, и, следовательно, проблема, с которой вы столкнулись.

0 голосов
/ 08 июля 2011

Разница между двумя библиотеками имеет значение не в том, используют ли они библиотеку Code Contracts или нет, а в том, есть ли у вас оператор using System.Collections.Generic; в файле кода, в котором работает отладчик.

Отладчик Visual Studio делает все возможное для оценки выражений, как если бы вы записывали это выражение в строку кода, в которую вы переходите, и это включает соблюдение лексической области действия этой строки кода; если бы вы попытались привести к List<int> в файле, который не имеет using System.Collections.Generic;, это также привело бы к ошибке с ошибкой.

...