"Пакет совместимости" для резервного копирования новых возможностей .NET Framework?

По разным причинам я часто считаю желательным писать код, совместимый с .NET framework 2.0 или 3.5 или совместимый с .NET Compact Framework, но проблема в том, что в новой .NET есть множество "маленьких" функций. которые недоступны в старых рамках или Compact Framework.

Например, я считаю, что методы расширения действительно полезны, но для этого компилятор зависит от System.Runtime.CompilerServices.ExtensionAttribute. Вы можете легко определить этот атрибут самостоятельно, а затем использовать методы расширения в .NET Framework 2.0 (в С# 3.0+). Аналогично, не так сложно вручную определить небольшие типы .NET 4, такие как Tuple<T1,T2> и Lazy<T>. Кстати, если вы хотите использовать 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)
  • LINQ-to-objects (не в .NET 2)
  • Tuple<...> (не в .NET 3.5)
  • Lazy<T> и Lazy<T,TMetadata> (не в .NET 3.5)
  • Деревья выражений (не в .NET 2, незавершенные в .NET 3.5)
  • Разница в переменных (существует в .NET 2, но недоступна для С# 3 и VB 9)
  • Reflection.Emit (отсутствует в .NETCF; на самом деле это не маленькая функция, но я очень скучаю по ней)

Ответы

Ответ 1

Библиотеки Theraot

Вы можете использовать Theraot.Core из Theraot Libraries для резервного копирования большой части кода .NET в старые версии, начиная с .NET 2.0. к условной компиляции.

Из указанных функций включены следующие функции:

  • ExtensionAttribute
  • Func<...> и Action<...> делегаты
  • LINQ к объектам
  • Tuple<...>
  • Lazy<T> и Lazy<T,TMetadata>
  • Травма выражения

Также включены следующие функции, не упомянутые в вопросе:

  • HashSet<T>
  • SortedSet<T>
  • ThreadLocal<T>
  • IObservable<T> и IObserver<T>
  • BigInteger
  • ConcurrentDictionary<Tkey, TValue>
  • и т.д...

Примечание. Планируется поддержка System.Threading.Tasks.

К сожалению, на момент написания документации имеется только небольшая документация, но любая разница в поведении от BCL может считаться ошибкой и может быть сообщена через github.

Ответ 2

На самом деле это не "пакет совместимости", но поскольку вы упомянули LinqBridge... еще одна "бэкпордированная функция" I часто используются параллельные расширения, найденные (среди прочего) в Reactive Extensions (Rx) для Framework 3.5 SP1 (в System.Threading.dll). Он включает полную реализацию параллельной библиотеки задач и параллельной LINQ (PLINQ).

Для .Net 4.0 существует Async Targeting Pack для Visual Studio 2012 (nuget) от Microsoft. Который обеспечивает многие методы расширения Async и обеспечивает поддержку ключевых слов async/await, если используется компилятор С# 5.

Аналогично для .Net 3.5 существует AsyncBridge, который основывается на библиотеке TPL Reactive Extentions для предоставления async/await. Существует также версия AsyncBridge для .Net 4.0, но я не уверен, почему вы хотите, чтобы она была одной из Microsoft.

Ответ 3

Для .NET 3.5 вы можете использовать файл FSharp.Core.dll из R # Runtime для .NET Framework 2.0.

"Основная библиотека (FSharp.Core.dll), включенная в этот распространяемый пакет, содержит некоторые API-интерфейсы в пространствах имен System, которые идентичны API-интерфейсам .NET Framework 4, которые необходимы для разработки F #.

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

Это включает System.Tuple et al. и System.Lazy<T>. (Не Lazy<T,TMetadata> хотя.) Чтобы использовать их только ссылку FSharp.Core.dll.

Edit: Turning out Lazy in FSharp.Core.dll не является заменой, а скорее является interop-классом. Он имеет те же свойства, но не те же самые конструкторы. Скорее он создан, например. например:

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

Ответ 4

Я не знаю, насколько полезен такой список, поскольку он потенциально чудовищный по размеру. CLR одинакова для 2.0, 3.0 и 3.5, поэтому каждая из этих функций после 2.0 может попасть в "пакет совместимости".

-Oisin