由于各种原因,我经常发现编写与.NET framework 2.0或3.5兼容或与.NET Compact Framework兼容的代码是可取的,但是新.NET中存在许多“小”特性是一个问题。旧框架或Compact Framework中没有的框架。
例如,我发现扩展方法确实很有用,但编译器依赖于System.Runtime.CompilerServices.ExtensionAttribute
。您可以自己轻松定义此属性,然后在.NET Framework 2.0中使用扩展方法(在C#3.0+下)。同样,手动定义像Tuple<T1,T2>
和Lazy<T>
这样的小型.NET 4类型并不困难。顺便说一下,如果你想在.NET 2.0中使用LINQ,你可以使用LinqBridge。
现在假设您将ExtensionAttribute
公开,以便您编写的其他程序集可以使用它。一开始就没问题,但是如果你想使用也有同样想法的第三方库呢?您添加对该库的引用,现在您有名称冲突。糟糕。
我还注意到一些新的库只适用于.NET 4.0或3.5,即使它们只有很小的依赖关系,可以使用兼容包或LinqBridge解决。
如果旧版.NET的“兼容包”在一个小DLL中定义了这些小功能,你可以证明包括在任何大小的项目中,这肯定会很好。这样的事情存在吗?
更新:从沉默来判断,我猜没有这样的事情。如果有兴趣,我可能会自己创建这样一个OSS库。所以我的新问题是,如果您正在为.NET 2,.NET 3.5,.NETCF或Silverlight编写,那么您将错过.NET 4的较小功能(与WCF / WPF等怪物相对) ?我将开始列表...
ExtensionAttribute
(不在.NET 2中)Func<...>
和Action<...>
代表(不在.NET 2中)Tuple<...>
(不在.NET 3.5中)Lazy<T>
和Lazy<T,TMetadata>
(不在.NET 3.5中)Reflection.Emit
(从.NETCF中遗漏;不是一个小功能,但我非常想念)答案 0 :(得分:5)
Theraot的图书馆
由于条件编译,您可以使用Theraot's Libraries中的Theraot.Core
来将.NET代码的很大一部分反向移植到以.NET 2.0开头的旧版本。
在上述功能中,包括以下内容:
ExtensionAttribute
Func<...>
和Action<...>
代表Tuple<...>
Lazy<T>
和Lazy<T,TMetadata>
还包括以下问题中未提及的功能:
HashSet<T>
SortedSet<T>
ThreadLocal<T>
IObservable<T>
和IObserver<T>
BigInteger
ConcurrentDictionary<Tkey, TValue>
注意:计划支持System.Threading.Tasks
。
可悲的是,目前编写的文档很少,但BCL行为的任何差异都可视为错误,可以是reported via github。
答案 1 :(得分:3)
这不是真正的“兼容性包”,但是自从你提到LinqBridge ...我经常使用的另一个“后向移植功能”是{{3}中找到的并行扩展(以及其他内容) for Framework 3.5 SP1(在System.Threading.dll
中)。它包括完整实现任务并行库和并行LINQ(PLINQ)。
对于.Net 4.0,有来自Microsoft的Reactive Extensions (Rx)(Async Targeting Pack for Visual Studio 2012)。其中提供了许多异步扩展方法,并在使用C#5编译器时为async
/ await
关键字提供支持。
对于.Net 3.5,同样有nuget构建在Reactive Extentions的TPL库上,以提供async
/ await
。还有.Net 4.0的AsyncBridge版本,但我不确定为什么你会想要那个来自微软的版本。
答案 2 :(得分:1)
对于.NET 3.5,您可以使用F#Runtime for .NET Framework 2.0中的FSharp.Core.dll。
“此可再发行组件包中包含的核心库(FSharp.Core.dll)包含System命名空间中的一些API,这些API与F#开发所需的.NET Framework 4 API相同。”
http://msdn.microsoft.com/en-us/library/ee829875%28v=vs.100%29.aspx
这包括System.Tuple
等。和System.Lazy<T>
。 (但不是Lazy<T,TMetadata>
。)要使用它们,只需引用FSharp.Core.dll。
编辑:原来FSharp.Core.dll
中的懒惰不是替代品,而是更多的互操作级别。它具有相同的属性,但不是相同的构造函数。而是它被创建,例如像这样:
Lazy<string> lazy = Microsoft.FSharp.Control.LazyExtensions.CreateFromValue("test");
答案 3 :(得分:0)
我不知道这样的列表会有多大用处,因为它的大小可能是巨大的。对于2.0,3.0和2的CLR,CLR是相同的。 3.5因此,任何这些2.0后的功能都可以成为“兼容包”。
-Oisin