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!
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
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 uniqueVous 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.
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.