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

Nos*_*ama 10 .net c# dll build

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

Eri*_*kel 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 ;-)


小智 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符号.


Otá*_*cio 9

除非你需要使用3.0或3.5功能,否则我会保持2.0.

  • @Tony - 我不这么认为.人们应该采用新的东西,因为它们是有用的,而不是因为它们是新的. (5认同)
  • 虽然我了解你的来源,但这种方法似乎会减慢/停止采用更新版本的.net. (2认同)