2010-08-11 25 views
14

Vì nhiều lý do khác nhau, tôi thường thấy viết mã tương thích với .NET framework 2.0 hoặc 3.5 hoặc tương thích với .NET Compact Framework, nhưng vấn đề là có rất nhiều tính năng "nhỏ" trong các framework .NET mới. không có sẵn trong các khung công tác cũ hơn hoặc Compact Framework."Gói Tương thích" để quay lại các tính năng .NET Framework mới?

Ví dụ: tôi thấy các phương pháp tiện ích thực sự hữu ích, nhưng trình biên dịch phụ thuộc vào System.Runtime.CompilerServices.ExtensionAttribute cho việc này. Bạn có thể dễ dàng tự xác định thuộc tính này và sau đó sử dụng các phương thức mở rộng trong .NET Framework 2.0 (trong C# 3.0+). Tương tự như vậy, không quá khó để xác định một cách thủ công các kiểu .NET 4 nhỏ như Tuple<T1,T2>Lazy<T>. Nhân tiện, nếu bạn muốn sử dụng LINQ trong .NET 2.0, bạn có thể sử dụng LinqBridge.

Bây giờ giả sử bạn thực hiện công khai ExtensionAttribute để các hội đồng khác mà bạn viết có thể sử dụng. Đó là tốt lúc đầu, nhưng nếu bạn sau đó muốn sử dụng một thư viện bên thứ 3 cũng có ý tưởng tương tự? Bạn thêm một tham chiếu đến thư viện đó và bây giờ bạn đã có một va chạm tên. Rất tiếc.

Tôi cũng nhận thấy rằng một số thư viện mới chỉ có sẵn cho .NET 4.0 hoặc 3.5 mặc dù chúng chỉ phụ thuộc vào nó có thể được giải quyết bằng gói tương thích hoặc LinqBridge. Nó sẽ chắc chắn là tốt đẹp nếu có "gói tương thích" cho các phiên bản .NET cũ hơn đã định nghĩa các tính năng nhỏ này trong một DLL nhỏ mà bạn có thể biện minh bao gồm trong các dự án có kích thước bất kỳ. Có một điều như vậy tồn tại?

Cập nhật: Đánh giá bởi sự im lặng, tôi đoán không có điều như vậy. Tôi có thể tự mình làm một thư viện OSS nếu có sự quan tâm. Vì vậy, câu hỏi mới của tôi là, những gì nhỏ hơn tính năng của .NET 4 (như trái ngược với quái vật như WCF/WPF) bạn sẽ bỏ lỡ nếu bạn đang viết cho .NET 2, .NET 3.5, .NETCF hoặc Silverlight? Tôi sẽ bắt đầu danh sách đi ...

  • ExtensionAttribute (không trong .NET 2)
  • Func<...>Action<...> đại biểu (không có trong .NET 2)
  • LINQ-to-đối tượng (không phải trong. NET 2)
  • Tuple<...> (không trong .NET 3,5)
  • Lazy<T>Lazy<T,TMetadata> (không có trong .NET 3.5)
  • Trees Biểu hiện (không có trong .NET 2; không đầy đủ trong .NET 3.5)
  • Biến đổi Generics (tồn tại trong .NET 2 nhưng không thể truy cập từ C# 3 và VB 9)
  • Reflection.Emit (thiếu từ .NETCF; không thực sự là một tính năng nhỏ nhưng tôi nhớ nó rất nhiều)

Trả lời

5

Libraries Theraot của

Bạn có thể sử dụng Theraot.Core từ Theraot's Libraries để backport một phần lớn mã NET với các phiên bản cũ bắt đầu với .NET 2.0 nhờ vào biên soạn có điều kiện.

Trong số các tính năng được đề cập, sau đây là bao gồm: các đối tượng LINQ-to-

  • Tuple<...>
  • Lazy<T>Lazy<T,TMetadata>
    • ExtensionAttribute
    • Func<...>Action<...> đại biểu
    • Biểu thức Tre ss

    Cũng bao gồm là những tính năng sau đây không được đề cập trong câu hỏi:

    • HashSet<T>
    • SortedSet<T>
    • ThreadLocal<T>
    • IObservable<T>IObserver<T>
    • BigInteger
    • ConcurrentDictionary<Tkey, TValue>
    • vv ...

    Lưu ý: Hỗ trợ cho System.Threading.Tasks được lên kế hoạch.

    Đáng buồn thay, chỉ có ít tài liệu có sẵn tại thời điểm viết, nhưng bất kỳ sự khác biệt nào về hành vi từ BCL có thể được coi là lỗi và có thể là reported via github.

  • +0

    Tôi đã có thể biên dịch [dotNetLiquid] (http://dotliquidmarkup.org/) cho .Net 2.0 bằng Thư viện Theraot, và tất cả các bài kiểm tra đơn vị của họ đều thành công (tốt, ngoại trừ một - nhưng điều đó không thành công ngay cả khi tôi xây dựng .net 4). Sử dụng [LinqBridge] (http://www.albahari.com/nutshell/linqbridge.aspx) là không đủ vì nó không hỗ trợ các biểu thức. – anikiforov

    0

    Tôi không biết danh sách này hữu ích như thế nào, vì nó có khả năng khổng lồ về kích thước. CLR là giống nhau cho 2.0, 3.0 & 3.5 vì vậy, về mặt tehnically bất kỳ của các tính năng sau 2.0 có thể thực hiện theo cách của họ vào một "compatibilty pack."

    -Oisin

    3

    Đây không phải là thực sự là một "gói compatilibity", nhưng kể từ khi bạn đề cập LinqBridge ... một "tính năng backported" Tôi thường xuyên sử dụng là mở rộng song song tìm thấy (trong số những thứ khác) trong Reactive Extensions (Rx) cho Framework 3.5 SP1 (trong số System.Threading.dll).Nó bao gồm việc thực hiện đầy đủ Thư viện song song nhiệm vụ và LINQ song song (PLINQ).

    Đối với .Net 4.0, có Async Targeting Pack for Visual Studio 2012 (nuget) từ Microsoft. Cung cấp nhiều phương thức mở rộng Async và cung cấp hỗ trợ cho các từ khóa async/await nếu sử dụng trình biên dịch C# 5.

    Tương tự đối với .Net 3.5, có AsyncBridge được xây dựng trên thư viện TPL của Phản hồi Extentions để cung cấp async/await. Ngoài ra còn có một phiên bản của AsyncBridge cho .Net 4.0, nhưng tôi không chắc chắn lý do tại sao bạn sẽ muốn một trong số đó từ Microsoft.

    1

    Đối với .NET 3.5, bạn có thể sử dụng FSharp.Core.dll từ F # Runtime cho .NET Framework 2.0.

    "Thư viện lõi (FSharp.Core.dll) được bao gồm trong gói có thể phân phối lại này chứa một số API trong không gian tên hệ thống giống với .NET Framework 4 API cần thiết để phát triển F #."

    http://msdn.microsoft.com/en-us/library/ee829875%28v=vs.100%29.aspx

    này bao gồm System.Tuple et al và System.Lazy<T> (Không Lazy<T,TMetadata> mặc dù.) Để sử dụng chúng chỉ cần tham khảo FSharp.Core.dll

    Edit:... Hóa ra Lazy trong FSharp.Core.dll là thay vì nó được tạo ra, ví dụ như thế này:

    Lazy<string> lazy = Microsoft.FSharp.Control.LazyExtensions.CreateFromValue("test"); 
    
    Các vấn đề liên quan