我应该使用类库来定位.NET Framework和C#版本?

时间:2009-07-30 11:08:13

标签: c# .net dll build

我正在构建一个DLL类库 - 我想让尽可能多的人使用它。我应该使用哪个版本的.NET Framework和哪个C#版本?是否可以为不同版本生成向后兼容的DLL或不同的DLL?或者Windows是否自动更新.NET框架,所以我应该使用最新版本?任何指导赞赏!

12 个答案:

答案 0 :(得分:11)

就个人而言,我的目标是.NET 2.0。这意味着,除其他外:

  • 没有扩展方法(虽然有解决方法)
  • 没有linq

  • 您可以使用lambda表达式

  • 您可以使用'var'关键字

问题是,您可以使用C#3.x语言功能(所谓的语法糖),但您不能使用以C#3.x为目标的库(System.Core为1,包括扩展方法和LINQ)。

我不会尝试支持C#1.x,因为它与C#2.x及更高版本完全不同。此外,我希望大多数使用你的图书馆的人都是建造新东西的人,他们不会在正确的思想中使用C#1.x; - )

答案 1 :(得分:10)

我们针对某些产品同时针对多个运行时版本(.NET 1.1,.NET 2.0和.NET 3.5)。

我们通过以下几种方式解决这个问题:

  • 单独的解决方案和项目文件以及.NET 1.1,2.0和3.5 SP1中的每一个,但引用相同的源文件。

例如:

 \ProductFoo_1_1.sln (.NET 1.1 solution, VS 2003)
 \ProductFoo_2_0.sln (.NET 2.0 solution, VS 2008)
 \ProductFoo_3_5.sln (.NET 3.5 solution, VS 2008)

 \FooLibrary\FooLibrary_1_1.csproj (.NET 1.1 Project, VS 2003) 
 \FooLibrary\FooLibrary_2_0.csproj (.NET 2.0 Project, VS 2008) 
 \FooLibrary\FooLibrary_3_5.csproj (.NET 3.5 Project, VS 2008) 

 \FooLibrary\FooClass.cs (shared amongst all Projects)
 \FooLibrary\FooHelpers_1_1.cs (only referenced by the .NET 1.1 project)

 \FooService\FooService_3.5.csproj (.NET 3.5 Project, VS 2008)
 \FooService\FooService.cs
  • 在每个解决方案中定义NET_X_X个符号

  • 对于.NET Framework特定代码,我们使用预处理器指令,如下所示:

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 

为了澄清,以#开头的上述行是预处理器命令。编译解决方案时,C#编译器(csc)预处理源文件。 如果您有#ifdef语句,则csc将评估以确定是否定义了该符号 - 如果是,则在编译项目时包括该段中的行。

这是一种在某些条件下标记要编译的代码的方法 - 我们还使用它在特定的详细调试版本中包含更密集的调试信息,如下所示:

#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 
  • 然后我们有NAnt脚本,可以自动生成每个.NET版本的发行版。 我们碰巧通过TeamCity控制所有这些,但我们也可以手动触发NAnt脚本。

它确实使事情变得更复杂,因此我们只倾向于在需要维护旧版.NET 1.1或2.0实例的地方(例如,客户无法/不会升级)。

我想当.NET 4.0推出时,我们会做同样的事情,只需添加一个NET_4_0符号。

答案 2 :(得分:9)

除非您需要使用3.0或3.5功能,否则我会将其保留为2.0。

答案 3 :(得分:4)

试试这个:

将目标模式切换到框架2.0(删除System.Core引用)。

如果没有编译,请尝试添加对linqbridge.dll的引用:

如果没有,那么你应该以3.5;)

为目标

答案 4 :(得分:2)

如果我要开始一个新项目,我会一直使用最新的运行时!如果3.5可用,为什么我需要在2.0或1.0中启动项目,除非我知道新版本存在严重错误?新版本意味着修复旧错误并添加新功能,因此这很好。

在将旧项目升级到新版本时,您需要考虑您的收益和损失。如果它被碾碎,升级它,如果不坚持使用旧版本。

请小心,因为新工具可能不支持旧版本。虽然2010年并非如此,因为它将支持最高2.0的所有版本。

答案 5 :(得分:0)

我投票支持Erik van Brakel的回答。 另外我想建议如果你想支持LINQ和扩展方法等3.5功能,你可以创建一个额外的库,比如说

MyLibrary.DLL

MyLibrary.LINQ.dll

因此使用与MS相同的方法(当他们离开System.dll 2.0版本但将所有新功能添加到System.Core.dll中时)

答案 6 :(得分:0)

我将使用包含核心功能的库来定位2.0版,并添加一个额外的目标库,以根据您的核心库添加一些扩展方法。

答案 7 :(得分:0)

从我的角度来看,如果你想要广泛的用户,你应该使用早期版本,1.1会很好,因为它可以在任何机器上运行.Net的版本。

答案 8 :(得分:0)

这取决于dll的用途。如果它只是一个你想让别人可以使用的通用C#逻辑,那么.net 2.0可能是你最好的选择。但是,如果它与.net中的较新功能有关,如WPF,EF,WCF,silverlight等,那么它将需要在支持该特定功能的.net版本中。

就个人而言,我会说在.net 3.5中写它只是因为从.net2.0到.net3.5的跳转是非常轻松的,因为没有太多的突破性变化,不像从.net1.x跳转到.net2 0.0。 :)

答案 9 :(得分:0)

我认为任何人都不再使用.Net 1.1。所以除非你真的想要使用3.5功能2.0应该没问题。此外,如果您可以控制谁将实际使用您的库,那么它也取决于它们。如果他们有最新的框架,那么你可以使用它。

答案 10 :(得分:0)

结合使用Will Hughes提到的方法,如果您希望访问/选项在可用时使用更新的功能,则在活动开发期间,使用最新的框架。当准备好开始发布候选版本时,设置为最低框架,然后当问题到达时,稳定地提升框架版本和/或使用#ifdef方法来解决问题。

答案 11 :(得分:0)

此解决方案效果很好。我只是设置了两个不同的项目,每个项目都有一个独特的“项目属性 - >构建 - >条件编译符号”,并在代码中使用,如下所示:

#if NET_4
            xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore; 
#endif
#if NET_3_5
            xmlReaderSettings.ProhibitDtd = false;                
#endif