Простой способ подсчета строк кода с помощью отражения

Мне нужна (очень грубая) оценка строк кода (без пробелов, без комментариев) сборки .net (С#). Есть ли простой способ сделать это с помощью отражения?

Я бы предпочел написанный от руки инструмент (поэтому я спрашиваю здесь об указателях...), но я бы также остановился на бесплатном (как в речи) инструменте.

Вот мой вариант использования:
Я работаю в команде над не очень большим проектом, код которого практически не покрыт. У нас есть отчет о покрытии, в котором указано около 60% охвата (здесь речь идет о модульных тестах). Но в этом отчете не отображаются сборки, в которых вообще нет модульных тестов.
Итак, получить отчет, близкий к правильному. Думаю, я пишу небольшой инструмент, который можно вызывать для каждой сборки без модульных тестов (я могу их найти) и создавать xml, подобный тому, который создается нашим инструментом покрытия, заявляя, что ничего не было покрыто. В качестве первого приближения для «утверждений» я думал, что считаю «строки кода».


person Nils    schedule 19.04.2011    source источник


Ответы (5)


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

Есть несколько способов сделать это. Вы можете (ab) использовать инструмент, такой как Reflector, и вызывать его сборки программно, чтобы декомпилировать ваши сборки обратно в C# и выполнять подсчет строк, или вы можете собирать информацию из файлов .pdb, чтобы получить номера строк. Эти файлы базы данных программы содержат всю эту информацию. Однако нет возможности читать pdbs с помощью отражения.

NDepend (инструмент, упомянутый Герри) использует информацию из файлов .pdb для подсчета количества строк.

Но поскольку вы уже используете инструмент покрытия кода, почему бы вам не добавить пустые проекты модульных тестов для непокрытых сборок и добавить эти тестовые проекты в ваш инструмент покрытия кода. Таким образом, вы можете увидеть общий охват всего проекта. Это будет дешевле, чем покупать NDepend, и гораздо дешевле, чем писать счетчик LoC вручную.

person Steven    schedule 19.04.2011
comment
Первые два предложения отлично отвечают на мой вопрос, спасибо. Добавление пустого юнит-теста также является хорошей идеей. Я имел в виду что-то более автоматическое, но я полагаю, что мы могли бы сказать, что каждой сборке нужна (по крайней мере, пустая) тестовая сборка и провалить всю сборку, если бы существовали сборки без тестов. - person Nils; 19.04.2011

VS2010 использует Metrics.exe (Microsoft). Инструмент подсчитывает строки кода из скомпилированных сборок. http://blogs.msdn.com/b/camerons/archive/2011/01/28/code-metrics-from-the-command-line.aspx

person Community    schedule 16.06.2011

Как насчет использования такого инструмента, как NDepend, вместо написания всего самостоятельно?

person Gerrie Schenck    schedule 19.04.2011
comment
Потому что а) я не уверен, смогу ли я написать это (хотя я мог бы попытаться) б) я не уверен, сможет ли он создать нужный мне xml (хотя я вполне мог бы это проверить) и в) это не бесплатно - ни ни в пиве, ни в речи... - person Nils; 19.04.2011
comment
@Nils: Это не бесплатно, но и не пишется от руки. Конечно, я предполагаю, что вам платят за то, что вы делаете ;-) - person Steven; 19.04.2011
comment
Не настолько, чтобы это считалось ;-) - person Nils; 19.04.2011

Ну а если вы говорите о скомпилированных сборках (как в .dll) то LOC оттуда не так просто получить. Все, что у вас есть, это инструкции IL, а один LOC обычно приводит к созданию нескольких инструкций IL. Если вы хотите свернуть свой собственный, вы, вероятно, захотите взглянуть на Postsharp, который позволяет вам пройти IL, и вы может подсчитать все интересные узлы, но это все равно оставляет вас с догадками о том, как рассчитать LOC.

Другим интересным проектом может быть ILSpy, который имеет декомпилятор и может реконструировать исходный код C# (приблизительно). Не уверен, что это сценарий, но его исходный код с открытым исходным кодом, поэтому вы можете расширить его для своих нужд.

Вы также можете попытаться извлечь информацию из файлов pdb. если они доступны. Это может быть более простой способ получить доступ к PDB< /а>

person ChrisWue    schedule 19.04.2011
comment
PDB доступны. Так что да - это тоже может быть способом. Спасибо. - person Nils; 19.04.2011
comment
Фактическое количество строк кода не имеет значения. Пока у вас есть один и тот же метод исторического подсчета, чтобы вы могли извлечь какое-то значение из показателей. - person ; 17.06.2011

Отражение дает вам метаданные, а не строки кода. Вместо этого загрузите сборки, найдите классы и модули и выдайте статистику о том, что следующие методы/модули не охватываются!

person Dipti Mehta    schedule 19.04.2011