“兼容包”用于向后移植新的.NET Framework功能?

时间:2010-08-11 20:14:29

标签: .net .net-3.5 compact-framework .net-2.0 compatibility

由于各种原因,我经常发现编写与.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中)
  • LINQ到对象(不在.NET 2中)
  • Tuple<...>(不在.NET 3.5中)
  • Lazy<T>Lazy<T,TMetadata>(不在.NET 3.5中)
  • 表达式树(不在.NET 2中;在.NET 3.5中不完整)
  • 泛型方差(存在于.NET 2中但无法从C#3和VB 9中访问)
  • Reflection.Emit(从.NETCF中遗漏;不是一个小功能,但我非常想念)

4 个答案:

答案 0 :(得分:5)

Theraot的图书馆

由于条件编译,您可以使用Theraot's Libraries中的Theraot.Core来将.NET代码的很大一部分反向移植到以.NET 2.0开头的旧版本。

在上述功能中,包括以下内容:

  • ExtensionAttribute
  • Func<...>Action<...>代表
  • LINQ到对象
  • Tuple<...>
  • Lazy<T>Lazy<T,TMetadata>
  • Expression Tress

还包括以下问题中未提及的功能:

  • 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