我正在构建一个DLL类库 - 我希望能够让尽可能多的人使用它。我应该使用哪个版本的.NET Framework和哪个C#版本?是否可以生成向后兼容的DLL或为不同版本生成不同的DLL?还是Windows会自动更新.NET Framework,所以我应该只使用最新版本?欢迎任何指导!
个人建议,我会以.NET 2.0为目标。这意味着,除其他事项外:
没有Linq
可以使用Lambda表达式
问题是,您可以使用C# 3.x语言特性(所谓的语法糖),但不能使用针对C# 3.x的库(例如System.Core,其中包括扩展方法和Linq)。
我不会尝试支持C# 1.x,因为它与C# 2.x及更高版本相差很大。此外,我预计大多数使用您的库的人是构建新项目的人,他们不会愚蠢到使用C# 1.x ;-)
我们针对某些产品同时针对多个运行时版本(.NET 1.1、.NET 2.0 和 .NET 3.5)。
我们有几种处理方式:
例如:
\ProductFoo_1_1.sln(.NET 1.1解决方案,VS 2003) \ProductFoo_2_0.sln(.NET 2.0解决方案,VS 2008) \ProductFoo_3_5.sln(.NET 3.5解决方案,VS 2008)
\FooLibrary\FooLibrary_1_1.csproj(.NET 1.1项目,VS 2003) \FooLibrary\FooLibrary_2_0.csproj(.NET 2.0项目,VS 2008) \FooLibrary\FooLibrary_3_5.csproj(.NET 3.5项目,VS 2008)
\FooLibrary\FooClass.cs(在所有项目中共享) \FooLibrary\FooHelpers_1_1.cs(仅由.NET 1.1项目引用)
\FooService\FooService_3.5.csproj(.NET 3.5项目,VS 2008) \FooService\FooService.cs
在每个解决方案中定义NET_X_X
符号
对于特定于.NET Framework的代码,我们使用预处理器指令,例如:
#if DEBUG_VERBOSE Logging.Log("使用参数调用 Web 服务:param = " + param); Logging.Log("Web 服务响应:" + response); Logging.Log("当前缓存大小(字节):" + cache.TotalBytes); // 等等。 #endif
我们有一些NAnt脚本,可自动化为每个 .NET 版本制作发布版。 我们恰好通过TeamCity控制所有这些内容,但我们也可以手动触发NAnt脚本。
这确实使事情变得更加复杂,因此我们只倾向于在需要维护遗留的.NET 1.1或2.0实例时执行它(例如,客户无法/不会升级)。
我想当.NET 4.0推出时,我们会做同样的事情,并添加一个 NET_4_0 符号。
如果您没有使用3.0或3.5的功能,我建议您将其保留在2.0版本。
这个解决方案非常有效。我只需设置两个不同的项目,每个项目都有独特的“项目属性->构建->条件编译符号”,并在代码中像这样使用:
#if NET_4
xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore;
#endif
#if NET_3_5
xmlReaderSettings.ProhibitDtd = false;
#endif
结合使用类似Will Hughes提到的方法,如果想在开发过程中获得访问/使用新功能的选项,请使用最新的框架。当准备开始制作发布候选版本时,将其设置为最低的框架,然后在出现问题时逐步提高框架版本和/或使用#ifdef方法解决。
MyLibrary.DLL
MyLibrary.LINQ.dll
因此采用与微软相同的方法(他们在保留System.dll 2.0版本的同时,将所有新功能添加到System.Core.dll中)