Come dovrei scrivere codice con sezioni univoche per diverse versioni di .NET
-
01-07-2019 - |
Domanda
Il mio codice sorgente deve supportare sia la versione .NET 1.1 che la 2.0 ...come posso testare le diverse versioni e qual è il modo migliore per affrontare questa situazione.
Mi chiedo se dovrei avere le due sezioni di codice in linea, in classi, metodi separati, ecc.Cosa ne pensi?
Soluzione
Se vuoi fare qualcosa del genere dovrai utilizzare i comandi del preprocessore e i simboli di compilazione condizionale.
Utilizzerei simboli che indicano chiaramente la versione di .NET a cui ti rivolgi (ad esempio NET11 e NET20) e quindi avvolgerò il codice pertinente in questo modo:
#if NET11
// .NET 1.1 code
#elif NET20
// .NET 2.0 code
#endif
La ragione per farlo in questo modo piuttosto che nel semplice if/else è un ulteriore livello di protezione nel caso qualcuno si dimentichi di definire il simbolo.
Detto questo, dovresti davvero approfondire il motivo per cui vuoi/necessario farlo.
Altri suggerimenti
Ci sono molte opzioni diverse qui.Dove lavoro usiamo i pragma #if ma potrebbe anche essere fatto con assembly separati per le versioni separate.
Idealmente dovresti almeno mantenere il codice dipendente dalla versione in file di classe parziali separati e rendere disponibile la versione corretta in fase di compilazione.Lo applicherei se potessi tornare indietro nel tempo, il nostro codice base ora ha molti pragma #if e talvolta può essere difficile da gestire.La parte peggiore dell'intera faccenda del pragma #if è che Visual Studio ignora semplicemente tutto ciò che non verrà compilato con le definizioni correnti e quindi è molto facile controllare le modifiche importanti.
NUnità supporta sia 1.1 che 2.0 e quindi è una buona scelta per un framework di test.Non è troppo difficile usare qualcosa del genere NAnt per creare build 1.1 e 2.0 separate e quindi eseguire automaticamente i test NUnit.
Vorrei porre la domanda sul PERCHÉ devi mantenere due basi di codice, ne sceglierei una e la seguirei se ce n'è qualche possibilità.
Cercare di mantenere due basi di codice sincronizzate con il numero di modifiche e i tipi di modifiche sarebbe molto complesso e un processo di creazione per entrambe le versioni sarebbe molto complesso.
Abbiamo riscontrato questo problema e ci siamo ritrovati con un "livello di compatibilità" in cui abbiamo implementato un unico set di interfacce e codice di utilità per .NET v1.1 e v2.0.
Quindi il nostro programma di installazione ha stabilito il codice giusto per la versione giusta.Abbiamo usato NSIS (gratuito!) e hanno funzioni che puoi chiamare per determinare la versione .NET.