web-dev-qa-db-fra.com

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

Je construis une bibliothèque de classes et je vais lui déployer un package NuGet, qui me permet de choisir différents assemblys à ajouter en tant que références en fonction de la version du framework .NET du projet auquel il est ajouté. C'est une fonctionnalité très agréable, mais ce que je me demande, c'est s'il est possible d'avoir un projet de bibliothèque de classe unique et de le construire avec plusieurs versions 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 offrira des fonctions async, qui est une fonctionnalité 4.5.

Quelqu'un sait-il quelle est la meilleure approche pour cela? Puis-je utiliser plusieurs configurations de build? Ou dois-je emprunter la route séparée du projet?

Si je travaillais en C++, j'utiliserais probablement plusieurs configurations et #if bloque les fonctions qui ne sont prises en charge que dans une seule configuration, mais je crains que cela m'amène à avoir deux assemblys avec le même nom qui font des choses différentes.

Merci d'avance!

47
Dave Kerr

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..."- Dialogue et choisissez Add as link)

Vous ajoutez maintenant 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 conditionnelle) 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 paramètres du projet sous Build-> General-> Conditional Compilation Switches

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
37
Jehof

Une approche simple consiste à ajouter un autre .csproj fichier dans le même dossier et configurez-le pour créer une version de framework différente. Cela évite d'avoir à ajouter 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

Dupliquer MyLibrary.csproj dans le même dossier et modifiez pour modifier quelques éléments:

  • <ProjectGuid> faites juste un nouveau GUID pour la valeur de cet élément
  • <TargetFrameworkVersion> spécifiez ici la version alternative, par exemple: v4.5 ou v3.5
  • <OutputPath> (pour Debug et Release) définissez ceci sur un chemin unique, tel que bin\Debug\net45 et bin\Debug\net45, pour permettre à la sortie de chaque projet de se retrouver dans un emplacement unique

Vous devez également ajouter un nouvel élément au _ non conditionnel <PropertyGroup>, afin que les deux projets ne se heurtent pas dans le dossier obj lors des builds parallèles. Ceci est important et protège contre les bogues de conditions de course étranges.

<PropertyGroup>
  <BaseIntermediateOutputPath>obj\net45\</BaseIntermediateOutputPath>

Enfin, ajoutez ce nouveau projet à votre solution existante.

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

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

15
Drew Noakes

Vieille question que je connais, et ce n'était pas une réponse appropriée à l'époque ... mais maintenant il est possible d'utiliser un projet partagé, ce qui est logiquement le même que d'ajouter un projet en tant que lien plutôt que chaque fichier individuellement.

5
Stephen Drew