我正在构建一个DLL类库 – 我希望使尽可能多的人可以使用它.我应该使用哪个版本的.NET Framework和哪个C#版本?是否可以为不同版本生成向后兼容的DLL或不同的DLL?或者
Windows自动更新.NET框架,所以我应该使用最新版本?任何指导赞赏!
解决方法
我们针对某些产品并发定位了多个运行时版本(.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符号.