我建立一个DLL类库 - 我想,以使其可通过尽可能多的人越好。 我应该使用哪个版本的.NET Framework和C#版本的? 是否有可能产生的不同版本的向后兼容的DLL或不同的DLL? 抑或是Windows会自动所以我应该只使用最新版本的更新.NET框架? 任何指导感激!
Answer 1:
我们的目标同时运行多个版本的一些产品(.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框架特定代码中,我们使用预处理指令,例如这样的:
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
- 然后我们有自动化生产的每一个.NET版本释放的楠脚本。 我们通过发生向TeamCity的控制这一切,但我们可以触发恶性脚本手动过。
它确实使事情变得更加复杂,所以我们只倾向于这样做,我们需要保持一个传统的.NET 1.1或2.0实例(例如当客户不能/不会升级)。
我想,当.NET 4.0来临时,我们会做同样的事情,只需添加一个NET_4_0象征。
Answer 2:
就个人而言,我会面向.NET 2.0。 这意味着,除其他事项外:
- 没有扩展方法(有解决方法虽然)
没有LINQ
你可以使用lambda表达式
- 您可以使用“无功”的关键字
关键是,你可以使用C#3.x的语言功能(所谓的语法糖),但你不能使用针对C#3.x的库(System.Core程序来命名一个,包括扩展方法和LINQ)。
我不会试图支持C#1.x中,因为它是从C#2.x和更高的完全不同。 此外,我希望谁还会用你的库中的人建设新的东西,谁也不会在他们的心中权使用C#1.x中大多数人;-)
Answer 3:
我会保持在2.0,除非你需要使用3.0或3.5的功能。
Answer 4:
试试这个:
切换靶向模式到框架2.0(除去System.Core程序参考)。
如果它不能编译,不是试图加入一个参考linqbridge.dll :
如果没有,那么就应该将3.5;)
Answer 5:
如果我要开始一个新的项目,我总是使用最新的运行! 3.5如果可以,我为什么需要2.0启动一个项目,或1.0,除非我知道有一些严重的错误与新版本? 新版本的平均修复旧的错误,并增加新的功能,所以这是很好的。
当谈到老项目升级到新的版本,那么你需要考虑你的盈亏。 如果其worthed,升级,如果不与旧版本的坚持。
要认真思考,因为新的工具可能不支持旧版本。 虽然这不是与2010年的情况,因为它会支持所有版本升级到2.0。
Answer 6:
我投埃里克面包车布拉克尔的答案。 此外,我想建议,如果你想支持像LINQ和扩展方法3.5功能,您可以创建一个额外的图书馆,说
MyLibrary.DLL
MyLibrary.LINQ.dll
因此利用相同的方法,MS那样(当他们离开System.dll中2.0版本,但添加了所有新功能引入System.Core.dll)
Answer 7:
我将针对2.0版包含了核心功能库,并添加一个额外的库目标3.5基础上添加自己的核心库的一些推广方法。
Answer 8:
从我的角度来看,如果你想有一个广泛的用户,你应该与早期版本中做到这一点,1.1将是很好的,因为它会在任何机器上运行了.NET什么都它的版本。
Answer 9:
这取决于DLL是什么。 如果它只是你想提供给别人,那么一个通用的C#.NET逻辑2.0可能是你最好的选择。 但是,如果它有什么关系像WPF,EF,WCF,Silverlight中,ECT .NET中的新功能,然后就需要在支持该特定功能的版本.NET的。
就个人而言,我会说,它写在.NET 3.5,只是因为从制作到.net2.0的.NET3.5跳是相当痛苦,因为有来自不同的.net1.x跳转到.net2.0没有多少重大更改。 :)
Answer 10:
我不认为任何人使用的.Net 1.1了。 所以,除非你真的想用3.5的功能2.0应该罚款。 此外,如果有谁去真正使用你的库溢出控制那就要看他们。 如果他们有最新的框架,那么你可以使用它。
Answer 11:
使用像威尔·休斯提到的一种方法相结合,如果你想访问/选项可用时使用较新的功能,积极发展过程中,使用最新的框架。 当准备开始做候选发布版,设置为最低的框架,然后当到达的问题,稳步撞了框架版本和/或使用#ifdef来的方法来锻炼身体。
Answer 12:
这个解决方案工作得很好。 我刚刚成立各两个不同的项目有一个独特的“项目属性 - >建设 - >条件编译符号”,并在这样的代码中使用:
#if NET_4
xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore;
#endif
#if NET_3_5
xmlReaderSettings.ProhibitDtd = false;
#endif