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

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

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

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

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

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

    2. Выберите символ, например VERSION2 , VERSION3 и т. VERSION2 , VERSION3 версии CLR.

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

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

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

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

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

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

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

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

    Давайте будем гением компьютера.