compilação condicional, dependendo da versão do framework em C #
-
03-07-2019 - |
Pergunta
Existem símbolos de pré-processamento que permitem algo como
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
ou alguma outra maneira de fazer isso?
Solução
Eu não acho que existem quaisquer símbolos predefinido 'pré-processamento'. No entanto, você pode conseguir o que você quer assim:
-
Criar configurações diferentes do seu projeto, uma para cada versão do CLR que você quer apoio.
-
Escolha um símbolo como
VERSION2
,VERSION3
etc. versão per CLR. -
Em cada configuração, defina o símbolo associado com ele e undefine todos os outros.
-
Use estes símbolos em blocos de compilação condicional.
Outras dicas
Não há qualquer embutido, mas você pode fornecer o seu próprio.
Para este cenário específico, você pode querer encapsular a lógica em (por exemplo) um invólucro (bloqueio) de classe, de modo que você não tem #if
espalhadas por todo o código; Claro, se você está apenas fazendo um pouco de bloqueio pode não valer a pena.
Eu uso diferentes configurações e / ou projetos de construção para uma variedade de plataformas - ou seja, protobuf- líquido constrói para .NET 2.0, 3.0 .NET, mono, CF 2,0, 3,5 CF usando este truque. O código tem blocos #if
com base em diferentes símbolos para a lógica de controlo - para que, por exemplo, BinaryFormatter
não está disponível em CF, WCF
só está disponível com .NET 3.0, Delegate.CreateDelegate
não é em CF 2.0, etc
Você pode usar o reflexo para verificar dinamicamente se um certo tipo como ReaderWriterLockSlim está disponível (em vez de usar o pré-processador).
Isto lhe daria a vantagem de que você pode implantar uma única versão de seu produto e usuários que têm (ou atualizar a) .NET 3.5 irá beneficiar o código otimizado.
Você pode configurar manualmente este símbolo usando o / definir compilador interruptor . Em seguida, você criar diferentes configurações de compilação para cada versão clr desejado.
Se isso é tudo o que você precisava fazer, eu suponho que você poderia uso Environment.Version, mas como solução do divo, parece deixar um monte de código desnecessária lá.