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

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

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

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

5 ответов

Решение

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

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

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

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

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

Там нет никаких встроенных, но вы можете поставить свой собственный.

Для этого конкретного сценария вы можете инкапсулировать логику в (например) класс-обертку (блокировку), чтобы у вас не было #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, оно, похоже, оставляет там много ненужного кода.

Другие вопросы по тегам