Условная компиляция в зависимости от версии фреймворка в C # - PullRequest
24 голосов
/ 03 января 2009

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

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

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

Ответы [ 5 ]

21 голосов
/ 03 января 2009

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

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

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

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

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

5 голосов
/ 03 января 2009

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

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

4 голосов
/ 03 января 2009

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

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

2 голосов
/ 03 января 2009

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

1 голос
/ 04 января 2009

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

...