Quelle est la meilleure façon de cibler plusieurs versions de la .NET framework?
Je suis en train de construire une bibliothèque de classe et je vais déployer un package NuGet, ce qui me permet de choisir différentes assemblées être ajoutés comme des références basées sur l' .NET framework version du projet, il est ajouté. C'est une fonctionnalité très intéressante, mais ce que je me pose est de savoir si il est possible d'avoir un seul projet de bibliothèque de classes, et de le construire à l'encontre de plusieurs versions de la .NET framework?
Je préfère éviter d'avoir:
MyLibrary40.dll
et MyLibrary45.dll
si possible, parce que les deux projets auraient à partager beaucoup de code. La version 4.5 offrira async
fonctions, qui est de 4,5 fonctionnalité.
Personne ne sait quelle est la meilleure approche pour ce qui est? Puis-je utiliser plusieurs configurations de build? Ou dois-je aller en bas de l'autre projet de route?
Si je travaillais en C++, je serais probablement utiliser plusieurs configurations et #if
blocs autour les fonctions qui ne sont pris en charge dans une configuration, mais j'ai peur que cela conduirait à m'avoir deux assemblées du même nom, qui font des choses différentes.
Merci d'avance!
- Si vous souhaitez cibler les différentes versions, dans une assemblée?
- c'est la meilleure façon d'obtenir BadImageException 🙂
- Mais, j'ai trouvé un travail autour de la compilation, vous pouvez regarder les liens que j'ai mis dans ma question, ils peuvent vous aider dans votre voyage - stackoverflow.com/questions/15549011/...
- Je veux avoir un fichier de projet, mais être en mesure de produire deux assemblées, l'une qui prend en charge .NET 4.0 et un que soutient .NET 4.5 et ajoute quelques async fonctions sans avoir à créer des projets distincts..
- J'ai demandé à ce aussi, non stricte de la réponse a été donnée, peut-être que vous aurez de meilleures réponses que j'ai eu, ce que vous avez besoin est le gestionnaire de configuration.. stackoverflow.com/questions/15321757/...
- cela peut aider aussi stackoverflow.com/questions/5006397/...
- Je crois que vous aurez des problèmes si vous essayez de compiler le code en tant 4.0, qui a 4.5 mots-clés / les appels de méthode qui n'existent pas.
- vous pouvez le faire, en suivant les liens que j'ai fournis, MAIS ce n'est pas sûr, une fois que vous en bas de l'exécution, il va avoir une mauvaise image d'exception ou de toute autre exception lors de l'appel de l'4.5 fonctionnement
- Mon point est qu'il n'a même pas de compiler si vous essayez d'utiliser le même projet pour plusieurs assemblées. Si vous essayez de compiler le programme suivant avec 4.0 - il échouera. la classe Program { static void main(string[] args) { DoStuff(); } private static async void DoStuff() { int mavaleur = attendent GetStuff(); } private static async Task<int> GetStuff() { attendent Tâche.Delay(5000); return 0; } }
- Si vous compilez à la version supérieure, puis essayez de la redirection convenu il va exploser au moment de l'exécution. Ma recommandation serait d'avoir plusieurs projets ou de ne pas utiliser le 4.5 caractéristiques.
- Merci à tous pour les commentaires, je suis allé avec la solution ci-dessous!
- C'est ce que la compilation conditionnelle devrait être utilisé pour.
Vous devez vous connecter pour publier un commentaire.
Vous aurez au moins besoin d'un VisualStudio Solution avec 2 projets (un pour .net 4 et un pour .net 4.5).
Ajouter tous les codefiles à l' .net 4-projet et dans l'autre projet que vous ajoutez le code des fichiers en tant que lien (utiliser
"Add Existing Item..."
-Dialogue et a choisiAdd as link
)Vous pouvez maintenant ajouter tous les codes et toutes les classes pour .NET 4.5 à votre 4.5-projet.
De plus, vous devez définir vos propres commutateurs du compilateur (symboles de compilation conditionnelle) pour vos projets. Comme NET4 pour votre .net 4-projet et NET4.5 votre .net 4.5-projet)
Vous réglez les commutateurs dans les paramètres du projet en vertu de Build->Général>Compilation Conditionnelle Commutateurs
Dans votre code, vous pouvez utiliser les commutateurs comme suit pour générer du code .NET 4 ou .NET 4.5
Une approche simple consiste à ajouter un autre
.csproj
fichier dans le même dossier, et de le configurer pour construire un cadre de référence différent de la version. Cela évite d'avoir à ajouter des liens vers des fichiers, comme les deux projets sont essentiellement vues au cours de la même structure de dossier.Dire que vous avez la structure:
Double
MyLibrary.csproj
dans le même dossier et modifier pour modifier un peu les choses:<ProjectGuid>
juste faire un nouveau GUID pour cette valeur de l'élément de<TargetFrameworkVersion>
spécifier la version alternative ici, par exemple:v4.5
ouv3.5
<OutputPath>
(pour Debug et Release) définir un chemin d'accès unique, commebin\Debug\net45
etbin\Debug\net45
, pour permettre la sortie de chaque projet à la fin dans un emplacement uniqueVous devez également ajouter un nouvel élément à la non-conditionnelle
<PropertyGroup>
élément, de sorte que les deux projets n'entrent pas en collision dans leobj
dossier pendant des constructions parallèles. C'est important, et protège contre bizarre condition de course de bugs.Enfin, ajouter ce nouveau projet à votre solution existante.
Cette approche fonctionne main dans la main avec la définition de la compilation commutateurs comme
NET35
etNET45
, et à l'aide de#if NET35
/#endif
directives.Deux projets open source qui utilisent cette technique sont MetadataExtractor et NetMQ. Vous pouvez les consulter dans le cas où vous frappez la difficulté.
.csproj
fichier devra être fait manuellement dans l'autre, ainsi (?), ce qui sonne comme un plutôt enclin à l'erreur d'approche.Une vieille question, je sais, et ce n'était pas une réponse appropriée à l'époque... mais maintenant, il est possible d'utiliser un Projet Partagé, qui est logiquement le même que l'ajout d'un projet en tant que lien plutôt que chaque fichier individuellement.