Все знают о такой замечательной возможности как "Multi-Targeting", которая появилась в Visual Studio 2008. С ее помощью мы можем указать версию фреймворка на котором хотим разрабатывать наше приложение. Однако, в таком случае могут возникнуть проблемы.
Допустим, мы создаем приложение и указываем, что будет использоваться .NET Framework 2.0.
Для примера воспользуемся экземпляром класса DateTimeOffset:
DateTimeOffset dt = new DateTimeOffset();
В MSDN можно увидеть, что этот класс доступен начиная с версии .NET Framework 2.0 Sp1:
Но мы ведь указали целевой фрейморк 2.0, а компилятор спокойно компилирует код в котором используется класс из Sp1. Получается, что если мы запустим наше приложение на машине, где стоит .NET Framework 2.0 без Sp1, то наша программа не будет работать.
Как раз чтобы предупредить разработчиков о такой ситуации было разработано Multi-Targeting правило для FxCop и студийного Code Analysis. В студии это правило появилось вместе с первым сервис-паком. А в FxCop оно вошло в новую версию 1.36, о выходе которой я упоминал в своем предыдущем посте.
Для того, чтобы включить это правило в Visual Studio необходимо зайти в настройки Code Analysis в свойствах проекта. Далее нужно развернуть узел "Portability Rules" и убедиться, что выбрана опция "Use only API from targeted framework":
Теперь если мы запустим утилиту Code Analysis на выполнение, мы получим предупреждение о том, класс DateTimeOffset является частью .NET Framework 2.0 Sp1 и возникнут проблемы при запуске приложения на фреймворке без сервис-пака:
Если вы пользуетесь FxCop'ом, то там также необходимо убедиться, что выбрано правило "Use only API from targeted framework":
Также в свойствах проекта (Project -> Options) на закладке Spelling & Analys необходимо удостовериться, что выбран необходимый фреймворк:
Запустив сборку на анализ мы увидим аналогичное предупреждение:
Разработчики FxCop и Code Analysis настоятельно рекомендуют использовать это правило если ваше приложение должно работать на различных версиях .NET Framework.
...по материалам блога Дейва Кина.