Есть ли символы препроцессора, которые позволяют что-то вроде
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
или какой-либо другой способ сделать это?
Есть ли символы препроцессора, которые позволяют что-то вроде
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
или какой-либо другой способ сделать это?
Я не думаю, что есть предопределенные символы препроцессора. Однако вы можете достичь того, чего хотите:
Создайте различные конфигурации вашего проекта, по одному для каждой версии CLR, которую вы хотите поддерживать.
Выберите символ типа VERSION2
, VERSION3
и т.д. для версии CLR.
В каждой конфигурации определите один символ, связанный с ним, и определите все остальные.
Используйте эти символы в условных блоках компиляции.
Нет встроенных, но вы можете предоставить свои собственные.
Для этого конкретного сценария вам может потребоваться инкапсуляция логики в (например) класс оболочки (блокировки), чтобы у вас не было #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, и т.д.
Вы можете использовать отражение, чтобы динамически проверять, доступен ли определенный тип, например ReaderWriterLockSlim (вместо использования препроцессора).
Это даст вам преимущество в том, что вы можете развернуть единую версию своего продукта, а пользователи, имеющие (или обновляющие).NET 3.5, получат выгоду от оптимизированного кода.
Вы можете вручную установить этот символ, используя /define компилятор. Затем вы создаете разные конфигурации сборки для каждой желаемой версии clr.
Если это все, что вам нужно сделать, я полагаю, вы могли бы использовать Environment.Version, но, как решение divo, похоже, что он оставляет много ненужного кода там.