2010-08-11 5 views
14

다양한 이유로 .NET Framework 2.0 또는 3.5 또는 .NET Compact Framework와 호환되는 코드를 작성하는 것이 바람직하지만 새로운 .NET 프레임 워크에는 수많은 "작은"기능이있는 것이 문제입니다. 이전 프레임 워크 나 Compact Framework에서는 사용할 수 없습니다.새로운 .NET Framework 기능을 백 포트하기위한 "Compatibility Pack"은 무엇입니까?

예를 들어, 확장 메서드가 실제로 유용하다는 것을 알았지 만 컴파일러는 System.Runtime.CompilerServices.ExtensionAttribute에 의존합니다. 이 특성을 직접 정의한 다음 .NET Framework 2.0 (C# 3.0 이상)에서 확장 메서드를 사용할 수 있습니다. 마찬가지로 Tuple<T1,T2>Lazy<T>과 같은 작은 .NET 4 유형을 수동으로 정의하는 것도 그리 어렵지 않습니다. 그런데 .NET 2.0에서 LINQ를 사용하려면 LinqBridge을 사용할 수 있습니다.

여러분이 작성한 다른 어셈블리에서 사용할 수 있도록 ExtensionAttribute을 공개한다고 가정합니다. 처음에는 괜찮 았지만 같은 생각을 가진 타사 라이브러리를 사용하려면 어떻게해야합니까? 해당 라이브러리에 대한 참조를 추가하면 이름 충돌이 발생합니다. 죄송합니다.

일부 새로운 라이브러리는 호환성 팩이나 LinqBridge를 사용하여 해결할 수있는 사소한 종속성 만 있지만 .NET 4.0 또는 3.5에서만 사용할 수 있습니다.

작은 크기의 DLL에 이러한 작은 기능을 정의한 이전 .NET 버전의 경우 "호환성 팩"이 있으면 좋겠지 만 모든 크기의 프로젝트를 포함하여 정당화 할 수 있습니다. 그런 것이 있습니까?

업데이트 : 침묵으로 판단 할 때 나는 그런 것이 없다고 생각합니다. 관심이 있다면 직접 OSS 라이브러리를 만들 수도 있습니다. 그래서 내 새로운 질문은 무엇입니까 작은 (WCF/WPF 같은 괴물에 반대). NET 2, .NET 3.5, .NETCF 또는 Silverlight 용으로 쓰고 싶다면 .NET 4의 기능은 무엇입니까? 나는 ... 목록을 시작합니다

  • ExtensionAttribute

    (하지 .NET 2) (하지 .NET 2)
  • Func<...>Action<...> 대표
  • LINQ - 투 - 객체 (안한다. NET 2)
  • Tuple<...> (되지 .NET 3.5)
  • Lazy<T>Lazy<T,TMetadata> (되지 .NET 3.5)하지 .NET 2
  • 식 트리 (에 불완전 .NET 3.5) 01
  • Generics Variance (.NET 2에서는 존재하지만 C# 3 및 VB 9에서는 액세스 할 수 없음)
  • Reflection.Emit (.NETCF에서 누락; 작은 기능은 아니지만 많이보고 싶습니다.)

답변

5

Theraot의 도서관은

당신은 .NET과 조건부 컴파일 2.0 감사를 시작하기 이전 버전에 .NET 코드의 큰 부분을 백 포트에 Theraot's Libraries에서 사용 Theraot.Core를 사용할 수 있습니다. 언급 된 기능 중

는 다음이 포함됩니다 :

  • ExtensionAttribute
  • Func<...>Action<...> 대표
  • Tuple<...>
  • Lazy<T>Lazy<T,TMetadata>
  • 을 LINQ - 투는-객체 표현의 Tre SS
  • 또한 다음과 같은 특징이 질문에 언급되지 않은 포함

:

  • HashSet<T>
  • SortedSet<T>
  • ThreadLocal<T>
  • IObservable<T>IObserver<T>
  • BigInteger
  • ConcurrentDictionary<Tkey, TValue>
  • 등 (3210) ...

참고 : System.Threading.Tasks에 대한 지원이 계획되어 있습니다.

슬프게도 문서 작성 시점에는 문서가 거의 없지만 BCL의 동작 차이는 버그로 간주 될 수 있으며 reported via github이 될 수 있습니다.

+0

Theraot 's Libraries를 사용하여 .Net 2.0 용 [dotNetLiquid] (http://dotliquidmarkup.org/)를 컴파일 할 수 있었으며 모든 유닛 테스트가 성공적으로 통과했습니다 (물론 하나만 제외). .net 4). [LinqBridge] (http://www.albahari.com/nutshell/linqbridge.aspx)는 식을 지원하지 않으므로 충분하지 않았습니다. – anikiforov

0

잠재적으로 크기가 엄청나기 때문에 그러한 목록이 얼마나 유용 할 지 모르겠습니다. CLR은 2.0, 3.0 & 3.5와 동일합니다. 따라서이 2.0 이후의 기능 중 일부는 "호환 패키지"로 전환 될 수 있습니다.

3

-Oisin이 정말 "compatilibity 팩 '이 아니라 당신이 LinqBridge을 언급 한 이후 Reactive Extensions (Rx)에서 (다른 것들 사이에) 발견 된 병렬 확장이 ... 또 다른"백 포트 기능은 "내가 자주 사용하는 Framework 3.5 SP1의 경우 (System.Threading.dll)여기에는 작업 병렬 라이브러리 및 병렬 LINQ (PLINQ)의 전체 구현이 포함됩니다.

.Net 4.0에는 Microsoft에서 제공하는 Async Targeting Pack for Visual Studio 2012 (nuget)이 있습니다. 많은 비동기 확장 메서드를 제공하며 C# 5 컴파일러를 사용하는 경우 async/await 키워드에 대한 지원을 제공합니다.

닷넷 3.5와 마찬가지로 async/await을 제공하기 위해 Reactive Extentions의 TPL 라이브러리에 빌드 된 AsyncBridge이 있습니다. 또한 .Net 4.0 용 AsyncBridge 버전이 있지만 Microsoft에서 제공하는 버전보다 그 버전이 필요한 이유가 확실하지 않습니다.

1

.NET 3.5의 경우 F # 런타임에서 .NET Framework 2.0의 FSharp.Core.dll을 사용할 수 있습니다.

"이 재배포 가능 패키지에 포함 된 핵심 라이브러리 (FSharp.Core.dll)에는 F # 개발에 필요한 .NET Framework 4 API와 동일한 시스템 네임 스페이스의 일부 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이에 게으른을 밝혀 드롭 인 대체는 아니지만 interop 클래스가 더 많습니다. 동일한 속성을 갖지만 동일한 생성자는 아닙니다. 예를 들어 다음과 같이 생성됩니다.

Lazy<string> lazy = Microsoft.FSharp.Control.LazyExtensions.CreateFromValue("test"); 
관련 문제