По разным причинам я часто считаю желательным написать код, совместимый с .NET framework 2.0 или 3.5 или совместимый с .NET Compact Framework, но проблема в том, что в новом .NET есть множество «мелких» функций. фреймворки, которые недоступны в старых фреймворках или Compact Framework.
Например, я считаю, что методы расширения действительно полезны, но для этого компилятор зависит от System.Runtime.CompilerServices.ExtensionAttribute
. Вы можете легко определить этот атрибут самостоятельно, а затем использовать методы расширения в .NET Framework 2.0 (в C # 3.0+). Точно так же нетрудно вручную определить небольшие типы .NET 4, такие как Tuple
и Lazy
. Кстати, если вы хотите использовать LINQ в .NET 2.0, вы можете использовать LinqBridge .
Теперь предположим, что вы сделали ExtensionAttribute
общедоступным, чтобы другие сборки, которые вы пишете, могли его использовать. Сначала это нормально, но что, если вы затем захотите использовать стороннюю библиотеку, в которой также была такая же идея? Вы добавляете ссылку на эту библиотеку, и теперь у вас есть конфликт имен. Упс.
Я также заметил, что некоторые новые библиотеки доступны только для .NET 4.0 или 3.5, хотя они имеют лишь незначительные зависимости от него, которые можно решить с помощью пакета совместимости или LinqBridge.
Это было бы неплохо. если бы существовали «пакеты совместимости» для более старых версий .NET, которые определяли эти маленькие функции в небольшой DLL, которые вы могли бы оправдать включение в проекты любого размера. Такое существует?
Обновление : Судя по тишине, такого нет. Я мог бы сам сделать такую библиотеку OSS, если есть интерес. Итак, мой новый вопрос: какие меньшие функции .NET 4 (в отличие от таких монстров, как WCF / WPF) вы бы упустили, если бы вы писали для .NET 2, .NET 3.5, .NETCF или Silverlight? Я начну список с ...
ExtensionAttribute
(не в .NET 2) Func <...>
и Action <...>
делегаты (не в .NET 2) Кортеж <...>
(не в .NET 3.5) Ленивый
и Lazy
(не в .NET 3.5) Reflection.Emit
(отсутствует в .NETCF; не совсем маленькая функция, но мне ее очень не хватает) Я не знаю, насколько полезным будет такой список, поскольку он потенциально чудовищен по размеру. CLR одинаков для версий 2.0, 3.0 и 3.5, поэтому технически любая из этих функций, вышедших после 2.0, может быть включена в «пакет совместимости».
-Oisin
На самом деле это не "пакет совместимости" , но поскольку вы упомянули LinqBridge... еще одна «функция резервного копирования», которую я часто использую, — это параллельные расширения, найденные (среди прочего) в реактивных расширениях (Rx) для Framework 3.5 SP1. (в System.Threading.dll
). Он включает полную реализацию библиотеки параллельных задач и параллельного LINQ (PLINQ).
Для .Net 4.0 существует пакет Async Targeting Pack для Visual Studio 2012 (nuget) от Microsoft. Который предоставляет множество методов расширения Async и обеспечивает поддержку ключевых слов async
/await
при использовании компилятора C# 5.
Аналогично для .Net 3.5 существует AsyncBridge, который основан на библиотеке TPL Reactive Extentions для обеспечения асинхронного
/ожидания
. Существует также версия AsyncBridge для .Net 4.0, но я не уверен, почему вам нужна именно эта, а не версия от Microsoft.