Je construis une bibliothèque de classe DLL - je veux le rendre utilisable par autant de personnes que possible. Quelle version du .NET Framework et quelle version C # devrais-je utiliser? Est-il possible de produire une DLL compatible à l'envers ou des DLL différentes pour différentes versions? Ou fait-il que Windows met à jour automatiquement la framework .NET afin que je devrais simplement utiliser la dernière version? Toute guidage appréciée! P>
12 Réponses :
Je le garderais à 2,0 que vous devez utiliser des fonctionnalités 3.0 ou 3.5. P>
Bien que je comprends d'où vous venez d'où vous venez, cette approche semble ralentir / arrêter l'adoption de nouvelles versions de .NET.
@Tony - Je ne pense pas. Les gens devraient adopter de nouvelles choses parce qu'ils sont utiles, pas parce qu'ils sont nouveaux.
Personnellement, je ciblerais .NET 2.0. Cela signifie, entre autres choses: p>
pas de linq p> li>
Vous pouvez utiliser des expressions Lambda p> li>
La chose est, vous pouvez utiliser des fonctionnalités de langue C # 3.x (le sucre syntaxique dite), mais vous ne pouvez pas utiliser de bibliothèques cible C # 3.x (System.core pour en nommer un, inclut des méthodes d'extension et LINQ). P>
Je n'essaierais pas de supporter c # 1.x, car il est très différent de c # 2.x et plus élevé. En outre, je m'attends à ce que la plupart des gens qui utiliseraient votre bibliothèque sont des personnes qui construisent de nouvelles choses qui ne seraient pas dans leurs bons esprits utilisent C # 1.x; -) p>
Si je devais commencer un nouveau projet, j'utiliserais toujours le plus récent runtime! Si 3.5 est disponible, pourquoi aurais-je besoin de démarrer un projet en 2.0, ou 1.0 à moins que je ne savais qu'il y a quelque chose de sérieusement mal avec la nouvelle version? Les nouvelles versions signifient la fixation de vieux bugs et l'ajout de nouvelles fonctionnalités, c'est bien. P>
En ce qui concerne la mise à niveau de l'ancien projet vers une nouvelle version, vous devez prendre en compte vos gains et pertes. Si sa valeur en vaut, mettez-la, sinon de rester avec l'ancienne version. P>
Faites attention à soigner car de nouveaux outils pourraient ne pas prendre en charge les anciennes versions. Bien que ce ne soit pas le cas avec 2010 car il prendra en charge toute la version jusqu'à 2.0. P>
Essayez ceci: p>
Commutateur Mode de ciblage sur Framework 2.0 (suppression du système.Core référence). P>
S'il ne compile pas, essayez d'ajouter une référence à Linqbridge.dll : p>
Sinon, vous devriez cibler 3.5;) P>
Mais s'il ajoute une référence à une DLL tiers, alors il aurait besoin de la libération aussi. À ce stade, il devrait simplement utiliser .NET3.0 ou plus.
Le pont LINQ est très petit, c'est adéquat. J'ai commencé avec .NET 2.0 et continuez à cibler que sur vs 2008 tout en profitant des fonctionnalités C # 3
@Tony: Je suppose que cela dépend de ce dont vous avez besoin;)
+1 pour mentionner Linqbridge.dll. Connaissait le concept bien sûr, mais pas encore à propos de cette bibliothèque spécifique.
Je vote pour la réponse d'Erik van Brakel. De plus, je voudrais suggérer que si vous souhaitez prendre en charge 3.5 fonctionnalités telles que LINQ et les méthodes d'extension, vous pouvez créer une bibliothèque supplémentaire, disons p>
mylibrary.dll p>
mylibrary.linq.dll p>
Utilisant donc la même approche que MS DID (quand ils ont quitté la version System.dll 2.0 mais ajouté toutes les nouvelles fonctionnalités dans System.Core.dll) P>
Je ciblerais la version 2.0 avec la bibliothèque contenant les fonctions principales et ajoutez une bibliothèque supplémentaire ciblant 3.5 pour ajouter des méthodes d'extension en fonction de votre bibliothèque principale. P>
Il y a toujours une chance que 2 personne écrira la même réponse :)
De mon point de vue, si vous voulez un large éventail d'utilisateurs, vous devez le faire avec les premières versions, 1.1 sera bien, car il fonctionnera sur n'importe quelle machine a une nouvelle version. P >
Personnellement, ce n'est pas une bonne idée. Principalement parce qu'il y a beaucoup de changements de rupture entre .net1.x et .net2.0
Cela dépend de ce que la DLL est pour. Si cela dispose d'une logique C # générique que vous souhaitez mettre à la disposition des autres, alors .NET 2.0 est probablement votre meilleur choix. Toutefois, si cela a quelque chose à voir avec les fonctionnalités plus récentes dans .net, comme WPF, EF, WCF, Silverlight, ECT, alors il devra être dans la version de .NET qui prend en charge cette fonctionnalité particulière. p>
Personnellement, je dirais que je l'écrirais dans .NET 3.5 Seulement parce que faire le saut de .NET2.0 à .NET3.5 est assez indolore car il n'y a pas beaucoup de modifications de rupture contrairement au saut de .net1.x à .net2 .0. :) p>
Je ne pense pas que personne utilise .NET 1.1 plus. Donc, à moins que vous ne souhaitiez vraiment utiliser 3.5 Caractéristiques 2.0 devrait être bien. De plus, si vous avez le contrôle de qui va réellement utiliser votre bibliothèque, alors cela dépend aussi de eux. S'ils ont le dernier cadre, vous pouvez utiliser cela. P>
Malheureusement tu as tort. Il reste encore des gens coincés à 1,1, parfois parce qu'ils ont encore besoin de soutenir les anciens systèmes d'exploitation.
Nous ciblons plusieurs versions d'exécution simultanément (.NET 1.1, .NET 2.0 et .NET 3.5) pour certains produits.
Nous gérons cela de plusieurs manières: p>
EG: P>
#if DEBUG_VERBOSE
Logging.Log("Web service Called with parameters: param = " + param);
Logging.Log("Web service Response: " + response);
Logging.Log("Current Cache Size (bytes): " + cache.TotalBytes);
// etc.
#endif
définissant pour le code spécifique .NET Framework, nous utilisons des instructions de préprocesseur telles que ceci: p> li>
ul> Pour clarification, les lignes ci-dessus commençant par # sont des commandes de préprocesseur. Lorsque vous compilez une solution, le compilateur C # (CSC) pré-traite les fichiers source.
Si vous avez une instruction C'est un moyen de marquer le code pour compiler dans certaines conditions - nous l'utilisons également pour inclure des informations de débogage plus intensives dans des constructions de débogage verbeuse spécifiques, comme: P> Cela rend les choses plus compliquées, nous avons donc seulement tendance à le faire là où nous devons maintenir une instance legacy 1.1 ou 2.0 (par exemple, où un client ne peut pas / ne pas mettre à niveau). P> J'imagine que lorsque .NET 4.0 roule autour, nous ferons la même chose et il suffit d'ajouter un symbole net_4_0. p> p> net_x_x code> symboles dans chacune des solutions p> li>
#IFDEF code>, SCC évaluera pour déterminer si ce symbole est défini - et dans l'affirmative, inclure les lignes dans ce segment lors de la compilation du projet. p>
public void SomeMethod(int param)
{
#ifdef NET_1_1
// Need to use Helper to Get Foo under .NET 1.1
Foo foo = Helper.GetFooByParam(param);
#elseif NET_2_0 || NET_3_5
// .NET 2.0 and above can use preferred method.
var foo = new Foo { Prop = param };
foo.LoadByParam();
#endif
foo.Bar();
}
#ifdef NET_3_5
// A method that is only available under .NET 3.5
public int[] GetWithFilter(Func Filter)
{
// some code here
}
#endif
combiné à utiliser une approche comme celle mentionnée par Will Hughes, si vous souhaitez que l'accès / option utilise des fonctionnalités plus récentes lorsqu'il est disponible, lors du développement actif, utilisez le dernier cadre. Lorsqu'il est prêt à commencer à faire des candidats à la libération, défini sur le cadre le plus bas, puis lorsque les problèmes arrivent, heurtent régulièrement la version-cadre et / ou utilisent l'approche #Ifdef pour travailler. P>
Cette solution fonctionne assez bien. Je viens de configurer deux projets différents avec une "propriétés du projet-> bâtiments-> symboles de compilation conditionnelle" et utilisée dans le code comme ceci: