要选择的.NET版本

本文关键字:版本 NET 选择 | 更新日期: 2023-09-27 18:20:24

我正在为我们的在线REST服务编写公共.NET类库版本,我无法决定选择哪个版本的.NET。

我想使用.NET 4.0版本,但这样编译的类库不能在.NET 2.0版本中使用?

也许有统计数据显示有多少开发人员使用.Net 2.0版本?

要选择的.NET版本

没有什么理由不使用最新版本的框架。你不仅可以获得所有加快开发时间的最新功能和口哨声,还可以利用微软在幕后所做的所有错误修复和改进。

针对早期版本的框架的唯一优势是徒劳地希望用户不必下载和安装任何东西就可以使用你的应用程序。但这远非万无一失,而且大多是徒劳的。请记住,Windows不是.NET Framework交付渠道,您不能可靠地假设用户将安装任何版本的.NET Framework。即使你坚持指望它与Windows捆绑在一起(你不应该这样做),很多用户仍然没有从Windows XP升级。即使你指望它会通过Windows Update推出,也有相当多的用户要么不使用Windows Update,要么不经常使用Windows Update;要么生活在互联网接入较差/速度较慢的偏远地区,无法下载所有这些更新。

这个故事的寓意是,无论如何,您都必须为您的应用程序提供适当版本的.NET Framework。而且.NET 4.0运行时实际上比以前的版本小得多,所以没有什么理由针对它们。该团队在这方面付出了很大的努力,他们的努力真的得到了回报。更好的是,正如阿托恩布拉德所指出的,大多数应用程序都可以针对该框架的客户端配置文件版本,该版本删除了一些不常用的部分,并将其再精简约16%。

此外,我强烈建议使用一个安装应用程序,它可以自动无缝地为用户安装所需的框架。Visual Studio内置了创建安装应用程序的支持,或者您可以使用第三方安装工具,如Inno setup。这使得使用最新版本变得轻而易举。

其他人似乎都在建议使用最新版本,所以如果你实际上不需要更新版本的任何功能,我会逆势而上,建议2.0。。。如果这真的是一个客户端库,并且你无法控制,也不知道谁将使用它。

这确实取决于你的用户可能是谁,而这反过来又取决于REST服务是什么。如果这是某种社交媒体的事情,那么我认为你的客户端将处于可以使用.NET4的环境中的可能性更大。如果它很可能被金融机构或其他大企业使用,他们可能没有使用.NET4的选项,所以你应该考虑早期版本。这就是我们为Noda Time所采取的方法,我们相信该库在各种情况下都会很有用,而且我们无法预测客户的需求。

当然,如果你了解所有的客户,并且知道他们都能使用.NET4,那么就去做吧。

坚持使用.NET 2.0的最大缺点是,您将无法在内部使用LINQ(除非您使用LINQBridge或类似的东西,这会为您的库添加另一个依赖项),并且您将无法(干净地)提供扩展方法。如果您使用更高版本,可以向客户端公开更多功能,则可能希望提供该库的多个版本,但显然这是一个令人头疼的维护问题。

另一个考虑因素是您是否应该提供Silverlight版本——这同样取决于您提供的服务类型和期望的用户类型。

如果您正在制作REST服务,您可能应该使用4.0。

您唯一需要考虑使用旧版本的时候是其他项目是否应该引用您编译的dll。REST服务是通过互联网上的HTTP公开的,客户端不会直接使用.dll。还是我理解错了这个问题?

几乎总是使用最新版本是个好主意,因为MS在这些版本中提供了很多错误修复和创新。

如果在您的系统中有2.0的限制,恐怕您需要使用该限制,因为您需要"让这些东西发挥作用"。

对于大约降级的版本,可以查看这个SO答案(但直到3.5版本)

如果您不创建适合现有遗留环境的库,则应始终使用最新版本。

如果我不理解你的意思,你想创建一个基于.NET的客户端库来使用你自己制作的一些REST服务。

也许您想提供一个客户端库,它可以被2.0、3.5和4.0应用程序使用,这是绝对可能的,并使用每个框架版本的最佳功能。

也许还有更多的方法,但我想向你推荐其中三种:

  1. 基于条件编译的方法。您可以使用遗留和更新的框架版本中的通用功能集来实现类,但要利用每个版本中的有用功能。这可以使用条件编译和编译符号,因为您可以根据目标框架版本定义要编译的特定代码(请检查此问题:是否可以有条件地编译到.NET framework版本?)。

  2. 基于Visual Studio 2010的方法中的符号链接。您可以选择使用一个通用功能集,记住这将是最旧版本中的功能集。也就是说,您可以创建一个在2.0中编译的项目,以及在更新版本中编译的其他项目,将所有可编译文件和嵌入资源作为符号链接添加到这些Visual Studio项目中。这将为任何受支持的框架版本生成一个程序集。您可以将基于条件编译的方法与此方法混合使用,并且您可以以非常可靠且易于维护的方式在各种框架版本中提供公共程序集请注意,无论何时向项目添加新的编译文件或资源,都需要为其他项目创建相应的符号链接。如果您想了解有关链接文件的更多信息,请查看此MSDN文章:http://msdn.microsoft.com/en-us/library/9f4t9t92.aspx.

  3. 特定于版本的优化程序集。也许是最耗时的方法。这需要付出更多的努力,但如果您的REST服务不是一个巨大的服务,那么您可以为每个框架版本开发一个特定的程序集,并利用所有这些程序集的最佳功能和方法。


我的看法

在我看来,我会采取#2的方法,因为它有#1和#3中最好的。如果你习惯了它,它很容易维护,而且都是关于纪律的,你的客户开发人员会有很多选择。

我会妥协,使用最古老的框架,为您(库的作者)提供最划算的服务。这是一种折衷方案,可以让你以最快的速度开发,并向更多的用户公开你的库。对我来说,这通常意味着3.5,因为我倾向于广泛使用LINQ。

只要不使用任何4.0特定的dll,同时提供2.0和4.0二进制文件应该是微不足道的。

你也可以发布你的客户端库源代码——.NET二进制文件已经很容易反编译了,这样你就不会泄露任何有价值的东西。