Existem alguns locais menores em que o código do meu projeto pode ser drasticamente aprimorado se a estrutura de destino for uma versão mais recente. Gostaria de aproveitar melhor a compilação condicional em C # para alterná-las conforme necessário.
Algo como:
#if NET40
using FooXX = Foo40;
#elif NET35
using FooXX = Foo35;
#else NET20
using FooXX = Foo20;
#endif
Algum desses símbolos vem de graça? Preciso injetar esses símbolos como parte da configuração do projeto? Parece fácil o suficiente, pois saberei qual estrutura está sendo direcionada no MSBuild.
/p:DefineConstants="NET40"
Como as pessoas estão lidando com essa situação? Você está criando configurações diferentes? Você está passando as constantes pela linha de comando?
Respostas:
Uma das melhores maneiras de fazer isso é criar diferentes configurações de compilação no seu projeto:
E em uma de suas configurações padrão:
O que definiria o padrão se não fosse definido em nenhum outro lugar. No caso acima, o OutputPath fornecerá um assembly separado sempre que você criar cada versão.
Em seguida, crie um destino AfterBuild para compilar suas diferentes versões:
Este exemplo recompilará o projeto inteiro com a variável Framework definida como NET20 após a primeira compilação (compilando ambas e assumindo que a primeira compilação foi o NET35 padrão acima). Cada compilação terá os valores de definição condicionais definidos corretamente.
Dessa maneira, você pode até excluir determinados arquivos no arquivo de projeto, se desejar #ifdef os arquivos:
ou mesmo referências
fonte
Uma alternativa que está funcionando para mim até agora é adicionar o seguinte ao arquivo do projeto:
Isso leva o valor da propriedade TargetFrameworkVersion, que é como "v3.5", substitui o "v" e "." para obter "NET35" (usando as novas funções de propriedade recurso ). Em seguida, ele remove qualquer valor "NETxx" existente e o adiciona ao final dos DefinedConstants. Pode ser possível simplificar isso, mas não tenho tempo para mexer.
Olhando na guia Build das propriedades do projeto no VS, você verá o valor resultante na seção de símbolos de compilação condicional. Alterar a versão da estrutura de destino na guia Aplicativo altera o símbolo automaticamente. Você pode usar as
#if NETxx
diretivas do pré-processador da maneira usual. Alterar o projeto no VS não parece perder o PropertyGroup personalizado.Observe que isso não parece fornecer algo diferente para as opções de destino do perfil do cliente, mas isso não é um problema para mim.
fonte
Eu tive problemas com essas soluções, possivelmente porque minhas constantes iniciais foram pré-criadas por essas propriedades.
O Visual Studio 2010 também gerou um erro por causa dos pontos e vírgulas, alegando que são caracteres ilegais. A mensagem de erro me deu uma dica, pois eu pude ver as constantes pré-construídas separadas por vírgulas, eventualmente seguidas pelo meu ponto-e-vírgula "ilegal". Depois de reformatar e massagear, consegui encontrar uma solução que funcionasse para mim.
Eu publicaria uma captura de tela da caixa de diálogo Configurações avançadas do compilador (aberta clicando no botão "Opções avançadas de compilação ..." na guia Compilar do seu projeto). Mas, como novo usuário, não tenho o representante para fazê-lo. Se você pudesse ver a captura de tela, veria as constantes personalizadas preenchidas automaticamente pelo grupo de propriedades e então diria: "Tenho que conseguir um pouco disso".
EDIT: Peguei aquele representante surpreendentemente rápido .. Obrigado pessoal! Aqui está a captura de tela:
fonte
Comece limpando as constantes:
Em seguida, construa sua depuração, rastreamento e outras constantes como:
Por fim, construa suas constantes de estrutura:
Eu acho que essa abordagem é muito legível e compreensível.
fonte
Em um arquivo .csproj, após uma
<DefineConstants>DEBUG;TRACE</DefineConstants>
linha existente , adicione:Faça isso nas configurações de compilação Debug e Release. Em seguida, use no seu código:
fonte
@Azarien, sua resposta pode ser combinada com a de Jeremy para mantê-la em um só lugar, em vez de Debug | Release etc.
Para mim, combinar as duas variações funciona melhor, ou seja, incluir condições no código usando #if NETXX e também criar versões diferentes da estrutura de uma só vez.
Eu tenho estes no meu arquivo .csproj:
e em metas:
fonte
Se você estiver usando o sistema de compilação .NET Core, poderá usar seus símbolos predefinidos (que já correspondem ao seu exemplo e não exigem nenhuma alteração no seu
.csproj
!):A lista de símbolos predefinidos está documentada em Developing Libraries with Cross Platform Tools e #if (Referência de C #) :
fonte