Quelle est la meilleure façon de cibler plusieurs versions du framework .NET?

Je construis une bibliothèque de classes et je vais la déployer dans un package NuGet, ce qui me permet de choisir différents assemblys à append en tant que références en fonction de la version du framework .NET à laquelle il a été ajouté. C’est une fonctionnalité très intéressante, mais ce que je me demande, c’est s’il est possible d’avoir un projet de bibliothèque de classes unique, et de le construire avec des versions multiples du framework .NET?

Je préfère éviter d’avoir:

MyLibrary40.dll et MyLibrary45.dll

si possible, car les deux projets devraient partager beaucoup de code. La version 4.5 proposera des fonctions async , ce qui est une fonctionnalité 4.5.

Est-ce que quelqu’un sait quelle est la meilleure approche pour cela? Puis-je utiliser plusieurs configurations de build? Ou dois-je emprunter l’itinéraire du projet distinct?

Si je travaillais en C ++, j’utiliserais probablement plusieurs configurations et blocs #if autour des fonctions qui ne sont supscopes que dans une configuration, mais je crains que cela ne me conduise à deux assemblages du même nom qui font des choses différentes.

Merci d’avance!

Vous aurez au moins besoin d’une solution VisualStudio avec 2 projets (un pour .net 4 et un pour .net 4.5).

Ajoutez tous les fichiers de code au projet .net 4 et dans l’autre projet, vous ajoutez les fichiers de code en tant que lien (utilisez "Add Existing Item..." -Dialog et choisissez Add as link )

Maintenant, vous ajoutez tous les codes et classes pour .NET 4.5 à votre projet 4.5.

De plus, vous devez définir vos propres commutateurs de compilation (symboles de compilation conditionnels) pour vos projets. Comme NET4 pour votre projet .net 4 et NET4.5 pour votre projet .net 4.5)

Vous définissez les commutateurs dans les parameters du projet sous Build-> General-> Commutateurs de compilation conditionnels

Dans votre code, vous pouvez utiliser les commutateurs comme suit pour générer du code pour .NET 4 ou .NET 4.5

 #if NET4 // code only for .NET 4 #endif // code for all framework versions. #if NET45 // code only for .NET 4.5 #endif 

Une approche simple consiste à append un autre fichier .csproj dans le même dossier et à le configurer pour créer une version différente du framework. Cela évite d’avoir à append des liens vers des fichiers, car les deux projets sont essentiellement des vues sur la même structure de dossiers.

Disons que vous avez la structure:

 - MyLibrary\ - MyLibrary.sln - MyLibrary\ - MyLibrary.csproj - Program.cs 

Dupliquez MyLibrary.csproj dans le même dossier et éditez-le pour modifier quelques éléments:

  • simplement un nouveau GUID pour la valeur de cet élément
  • spécifiez la version alternative ici, par exemple: v4.5 ou v3.5
  • (pour Debug and Release) définit ce chemin sur un chemin unique, tel que bin\Debug\net45 et bin\Debug\net45 , pour permettre à chaque projet de se retrouver dans un emplacement unique.

Vous devez également append un nouvel élément à l’élément non conditionnel, afin que les deux projets n’entrent pas en collision dans le dossier obj lors des générations parallèles. Ceci est important et protège contre les bogues de conditions de course bizarres.

  obj\net45\ 

Enfin, ajoutez ce nouveau projet à votre solution existante.

Cette approche va de pair avec la définition des commutateurs de compilation tels que NET35 et NET45 , et en utilisant les #if NET35 / #endif .

Deux projets open source utilisant cette technique sont MetadataExtractor et NetMQ . Vous pouvez vous y référer en cas de problème.

Ancienne question que je connais, et ce n’était pas une réponse appropriée à l’époque … mais il est maintenant possible d’utiliser un projet partagé, ce qui revient logiquement à append un projet en tant que lien plutôt que chaque fichier individuellement.