Условная компиляция в зависимости от версии фреймворка в C#
Есть ли символы препроцессора, которые позволяют что-то вроде
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
или другой способ сделать это?
5 ответов
Я не думаю, что есть какие-то предопределенные символы препроцессора. Однако вы можете достичь того, что вы хотите, как это:
Создайте различные конфигурации вашего проекта, по одной для каждой версии CLR, которую вы хотите поддерживать.
Выберите символ как
VERSION2
,VERSION3
и т. д. для версии CLR.В каждой конфигурации определите один связанный с ним символ и отмените все остальные.
Используйте эти символы в блоках условной компиляции.
Там нет никаких встроенных, но вы можете поставить свой собственный.
Для этого конкретного сценария вы можете инкапсулировать логику в (например) класс-обертку (блокировку), чтобы у вас не было #if
разбросаны по всему коду; конечно, если вы делаете небольшую блокировку, это может не стоить хлопот.
Я использую различные конфигурации и / или проекты для сборки на различных платформах - например, сборки protobuf-net для.NET 2.0, .NET 3.0, mono, 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, оно, похоже, оставляет там много ненужного кода.