Условная компиляция в зависимости от версии фреймворка в С#

Есть ли символы препроцессора, которые позволяют что-то вроде

#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif

или какой-либо другой способ сделать это?

Ответ 1

Я не думаю, что есть предопределенные символы препроцессора. Однако вы можете достичь того, чего хотите:

  • Создайте различные конфигурации вашего проекта, по одному для каждой версии CLR, которую вы хотите поддерживать.

  • Выберите символ типа VERSION2, VERSION3 и т.д. для версии CLR.

  • В каждой конфигурации определите один символ, связанный с ним, и определите все остальные.

  • Используйте эти символы в условных блоках компиляции.

Ответ 2

Нет встроенных, но вы можете предоставить свои собственные.

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

Я использую разные конфигурации и/или проекты для построения для различных платформ - т.е. protobuf-net для .NET 2.0,.NET 3.0, моно, CF 2.0, CF 3.5, используя этот трюк. Код имеет #if блоки на основе разных символов для управления логикой - так, например, BinaryFormatter недоступен в CF, WCF доступен только с .NET 3.0, Delegate.CreateDelegate не включен в CF 2.0, и т.д.

Ответ 3

Вы можете использовать отражение, чтобы динамически проверять, доступен ли определенный тип, например ReaderWriterLockSlim (вместо использования препроцессора).

Это даст вам преимущество в том, что вы можете развернуть единую версию своего продукта, а пользователи, имеющие (или обновляющие).NET 3.5, получат выгоду от оптимизированного кода.

Ответ 4

Вы можете вручную установить этот символ, используя /define компилятор. Затем вы создаете разные конфигурации сборки для каждой желаемой версии clr.

Ответ 5

Если это все, что вам нужно сделать, я полагаю, вы могли бы использовать Environment.Version, но, как решение divo, похоже, что он оставляет много ненужного кода там.